]> git.cameronkatri.com Git - mandoc.git/commitdiff
implement -Tman .Sm; OpenBSD rev. 1.9
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 7 Jul 2012 13:53:14 +0000 (13:53 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 7 Jul 2012 13:53:14 +0000 (13:53 +0000)
mdoc_man.c

index c68c2d31b881d8dd89c82a9151d37dbc67d828eb..de91630e6e5cf231a080cbd97c1d4cf890cbd298 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_man.c,v 1.11 2012/07/07 13:46:59 schwarze Exp $ */
+/*     $Id: mdoc_man.c,v 1.12 2012/07/07 13:53:14 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -18,6 +18,7 @@
 #include "config.h"
 #endif
 
+#include <assert.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -32,6 +33,7 @@
                  struct mman *mm
 
 struct mman {
+       int               mode_space; /* spacing mode: 1 = on */
        int               need_space; /* next word needs prior ws */
        int               need_nl; /* next word needs prior nl */
 };
@@ -64,6 +66,7 @@ static        int       pre_it(DECL_ARGS);
 static int       pre_nm(DECL_ARGS);
 static int       pre_ns(DECL_ARGS);
 static int       pre_pp(DECL_ARGS);
+static int       pre_sm(DECL_ARGS);
 static int       pre_sp(DECL_ARGS);
 static int       pre_sect(DECL_ARGS);
 static int       pre_ux(DECL_ARGS);
@@ -168,7 +171,7 @@ static      const struct manact manacts[MDOC_MAX + 1] = {
        { NULL, NULL, NULL, NULL, NULL }, /* Sc */
        { cond_body, pre_enc, post_enc, "`", "'" }, /* So */
        { cond_body, pre_enc, post_enc, "`", "'" }, /* Sq */
-       { NULL, NULL, NULL, NULL, NULL }, /* _Sm */
+       { NULL, pre_sm, NULL, NULL, NULL }, /* Sm */
        { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Sx */
        { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Sy */
        { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Tn */
@@ -229,8 +232,8 @@ print_word(struct mman *mm, const char *s)
         * Reassign needing space if we're not following opening
         * punctuation.
         */
-       mm->need_space = 
-               ('(' != s[0] && '[' != s[0]) || '\0' != s[1];
+       mm->need_space = mm->mode_space &&
+               (('(' != s[0] && '[' != s[0]) || '\0' != s[1]);
 
        for ( ; *s; s++) {
                switch (*s) {
@@ -298,6 +301,7 @@ man_mdoc(void *arg, const struct mdoc *mdoc)
 
        memset(&mm, 0, sizeof(struct mman));
 
+       mm.mode_space = 1;
        mm.need_nl = 1;
        print_node(m, n, &mm);
        putchar('\n');
@@ -630,6 +634,18 @@ pre_pp(DECL_ARGS)
        return(MDOC_Rs == n->tok);
 }
 
+static int
+pre_sm(DECL_ARGS)
+{
+
+       assert(n->child && MDOC_TEXT == n->child->type);
+       if (0 == strcmp("on", n->child->string))
+               mm->mode_space = 1;
+       else
+               mm->mode_space = 0;
+       return(0);
+}
+
 static int
 pre_sp(DECL_ARGS)
 {