Text ending in a full stop, exclamation mark or question mark
authorschwarze <schwarze@openbsd.org>
Fri, 16 Jul 2010 00:34:33 +0000 (00:34 +0000)
committerschwarze <schwarze@openbsd.org>
Fri, 16 Jul 2010 00:34:33 +0000 (00:34 +0000)
should not flag the end of a sentence if:

1) The punctuation is followed by closing delimiters
and not preceded by alphanumeric characters, like in
"There is no full stop (.) in this sentence"

or

2) The punctuation is a child of a macro
and not preceded by alphanumeric characters, like in
"There is no full stop
.Pq \&.
in this sentence"

jmc@ and sobrado@ like this

usr.bin/mandoc/libmandoc.h
usr.bin/mandoc/man.c
usr.bin/mandoc/mandoc.c
usr.bin/mandoc/mdoc.c
usr.bin/mandoc/mdoc_macro.c

index 9001dc7..c79a3c4 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: libmandoc.h,v 1.6 2010/06/26 17:56:43 schwarze Exp $ */
+/*     $Id: libmandoc.h,v 1.7 2010/07/16 00:34:33 schwarze Exp $ */
 /*
- * Copyright (c) 2009 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -29,7 +29,7 @@ time_t                 mandoc_a2time(int, const char *);
 #define                 MTIME_REDUCED          (1 << 1)
 #define                 MTIME_MDOCDATE         (1 << 2)
 #define                 MTIME_ISO_8601         (1 << 3)
-int             mandoc_eos(const char *, size_t);
+int             mandoc_eos(const char *, size_t, int);
 int             mandoc_hyph(const char *, const char *);
 
 __END_DECLS
index 9ac7f5f..cb994e8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.36 2010/07/13 01:09:13 schwarze Exp $ */
+/*     $Id: man.c,v 1.37 2010/07/16 00:34:33 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -405,7 +405,7 @@ man_ptext(struct man *m, int line, char *buf, int offs)
         */
 
        assert(i);
-       if (mandoc_eos(buf, (size_t)i))
+       if (mandoc_eos(buf, (size_t)i, 0))
                m->last->flags |= MAN_EOS;
 
 descope:
index b652e5e..aeef291 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mandoc.c,v 1.14 2010/06/26 17:56:43 schwarze Exp $ */
+/*     $Id: mandoc.c,v 1.15 2010/07/16 00:34:33 schwarze Exp $ */
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -324,8 +324,10 @@ mandoc_a2time(int flags, const char *p)
 
 
 int
-mandoc_eos(const char *p, size_t sz)
+mandoc_eos(const char *p, size_t sz, int enclosed)
 {
+       const char *q;
+       int found = 0;
 
        if (0 == sz)
                return(0);
@@ -336,8 +338,8 @@ mandoc_eos(const char *p, size_t sz)
         * propogate outward.
         */
 
-       for ( ; sz; sz--) {
-               switch (p[(int)sz - 1]) {
+       for (q = p + sz - 1; q >= p; q--) {
+               switch (*q) {
                case ('\"'):
                        /* FALLTHROUGH */
                case ('\''):
@@ -345,22 +347,22 @@ mandoc_eos(const char *p, size_t sz)
                case (']'):
                        /* FALLTHROUGH */
                case (')'):
+                       if (0 == found)
+                               enclosed = 1;
                        break;
                case ('.'):
-                       /* Escaped periods. */
-                       if (sz > 1 && '\\' == p[(int)sz - 2])
-                               return(0);
                        /* FALLTHROUGH */
                case ('!'):
                        /* FALLTHROUGH */
                case ('?'):
-                       return(1);
+                       found = 1;
+                       break;
                default:
-                       return(0);
+                       return(found && (!enclosed || isalnum(*q)));
                }
        }
 
-       return(0);
+       return(found && !enclosed);
 }
 
 
index 1debb67..51fb6e5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc.c,v 1.61 2010/07/13 01:09:13 schwarze Exp $ */
+/*     $Id: mdoc.c,v 1.62 2010/07/16 00:34:33 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -717,7 +717,7 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
 
        assert(buf < end);
 
-       if (mandoc_eos(buf+offs, (size_t)(end-buf-offs)))
+       if (mandoc_eos(buf+offs, (size_t)(end-buf-offs), 0))
                m->last->flags |= MDOC_EOS;
 
        return(1);
index c145394..b258157 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.54 2010/07/13 01:09:13 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.55 2010/07/16 00:34:33 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -606,7 +606,7 @@ append_delims(struct mdoc *m, int line, int *pos, char *buf)
                 * knowing which symbols break this behaviour, for
                 * example, `.  ;' shouldn't propogate the double-space.
                 */
-               if (mandoc_eos(p, strlen(p)))
+               if (mandoc_eos(p, strlen(p), 0))
                        m->last->flags |= MDOC_EOS;
        }
 
@@ -1262,7 +1262,7 @@ blk_part_imp(MACRO_PROT_ARGS)
         */
 
        if (n && MDOC_TEXT == n->type && n->string)
-               if (mandoc_eos(n->string, strlen(n->string)))
+               if (mandoc_eos(n->string, strlen(n->string), 1))
                        n->flags |= MDOC_EOS;
 
        /* Up-propogate the end-of-space flag. */