diff options
-rw-r--r-- | usr.bin/mandoc/libman.h | 5 | ||||
-rw-r--r-- | usr.bin/mandoc/man.c | 17 | ||||
-rw-r--r-- | usr.bin/mandoc/man_macro.c | 20 |
3 files changed, 31 insertions, 11 deletions
diff --git a/usr.bin/mandoc/libman.h b/usr.bin/mandoc/libman.h index 13a77810f4f..9d70a3c7505 100644 --- a/usr.bin/mandoc/libman.h +++ b/usr.bin/mandoc/libman.h @@ -1,6 +1,7 @@ -/* $Id: libman.h,v 1.38 2014/08/08 16:05:42 schwarze Exp $ */ +/* $OpenBSD: libman.h,v 1.39 2014/11/03 23:17:21 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> + * Copyright (c) 2014 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 @@ -53,6 +54,7 @@ struct man_macro { #define MAN_NSCOPED (1 << 3) /* See in_line_eoln(). */ #define MAN_NOCLOSE (1 << 4) /* See blk_exp(). */ #define MAN_BSCOPE (1 << 5) /* Break BLINE scope. */ +#define MAN_JOIN (1 << 6) /* Join arguments together. */ }; extern const struct man_macro *const man_macros; @@ -60,6 +62,7 @@ extern const struct man_macro *const man_macros; __BEGIN_DECLS int man_word_alloc(struct man *, int, int, const char *); +void man_word_append(struct man *, const char *); int man_block_alloc(struct man *, int, int, enum mant); int man_head_alloc(struct man *, int, int, enum mant); int man_tail_alloc(struct man *, int, int, enum mant); diff --git a/usr.bin/mandoc/man.c b/usr.bin/mandoc/man.c index 87f0310c5d1..e9ca83f030c 100644 --- a/usr.bin/mandoc/man.c +++ b/usr.bin/mandoc/man.c @@ -1,4 +1,4 @@ -/* $OpenBSD: man.c,v 1.89 2014/10/20 15:49:45 schwarze Exp $ */ +/* $OpenBSD: man.c,v 1.90 2014/11/03 23:17:21 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -313,6 +313,21 @@ man_word_alloc(struct man *man, int line, int pos, const char *word) return(1); } +void +man_word_append(struct man *man, const char *word) +{ + struct man_node *n; + char *addstr, *newstr; + + n = man->last; + addstr = roff_strdup(man->roff, word); + mandoc_asprintf(&newstr, "%s %s", n->string, addstr); + free(addstr); + free(n->string); + n->string = newstr; + man->next = MAN_NEXT_SIBLING; +} + /* * Free all of the resources held by a node. This does NOT unlink a * node from its context; for that, see man_node_unlink(). diff --git a/usr.bin/mandoc/man_macro.c b/usr.bin/mandoc/man_macro.c index 76b35f7f998..cfffb7787ce 100644 --- a/usr.bin/mandoc/man_macro.c +++ b/usr.bin/mandoc/man_macro.c @@ -1,7 +1,7 @@ -/* $Id: man_macro.c,v 1.51 2014/08/18 16:26:13 schwarze Exp $ */ +/* $OpenBSD: man_macro.c,v 1.52 2014/11/03 23:17:21 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2012, 2013 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de> * * Permission to use, copy, modify, and distribute this software for any @@ -16,7 +16,6 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - #include <sys/types.h> #include <assert.h> @@ -60,15 +59,15 @@ const struct man_macro __man_macros[MAN_MAX] = { { blk_imp, MAN_BSCOPE }, /* P */ { blk_imp, MAN_BSCOPE }, /* IP */ { blk_imp, MAN_BSCOPE }, /* HP */ - { in_line_eoln, MAN_SCOPED }, /* SM */ - { in_line_eoln, MAN_SCOPED }, /* SB */ + { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* SM */ + { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* SB */ { in_line_eoln, 0 }, /* BI */ { in_line_eoln, 0 }, /* IB */ { in_line_eoln, 0 }, /* BR */ { in_line_eoln, 0 }, /* RB */ - { in_line_eoln, MAN_SCOPED }, /* R */ - { in_line_eoln, MAN_SCOPED }, /* B */ - { in_line_eoln, MAN_SCOPED }, /* I */ + { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* R */ + { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* B */ + { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* I */ { in_line_eoln, 0 }, /* IR */ { in_line_eoln, 0 }, /* RI */ { in_line_eoln, MAN_NSCOPED }, /* na */ @@ -422,7 +421,10 @@ in_line_eoln(MACRO_PROT_ARGS) la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; - if ( ! man_word_alloc(man, line, la, p)) + if (man_macros[tok].flags & MAN_JOIN && + man->last->type == MAN_TEXT) + man_word_append(man, p); + else if ( ! man_word_alloc(man, line, la, p)) return(0); } |