summaryrefslogtreecommitdiffstats
path: root/mandoc.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-07-27 07:06:29 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-07-27 07:06:29 +0000
commit6623ec2f152206d69c4d01dd3cc346f52dcf85df (patch)
tree570e7bed51d8a463e3091598e11187fe9ad4e900 /mandoc.c
parent571a801caad4d1a19d985099b0ffa469a25de5a1 (diff)
downloadmandoc-6623ec2f152206d69c4d01dd3cc346f52dcf85df.tar.gz
Update mandoc_hyph() to the extent that numbers on either side of the
hyphen make for a non-breakable hyphen. Found by random testing.
Diffstat (limited to 'mandoc.c')
-rw-r--r--mandoc.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/mandoc.c b/mandoc.c
index c08465ff..e3e95a31 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -653,28 +653,39 @@ mandoc_eos(const char *p, size_t sz, int enclosed)
return(found && !enclosed);
}
+/*
+ * Choose whether to break at a hyphenated character (identified by the
+ * ASCII_HYPH value in the input string).
+ */
int
mandoc_hyph(const char *start, const char *c)
{
+ char l, r;
- /*
- * Choose whether to break at a hyphenated character. We only
- * do this if it's free-standing within a word.
- */
+ l = *(c - 1);
+ r = *(c + 1);
/* Skip first/last character of buffer. */
- if (c == start || '\0' == *(c + 1))
+ if (c == start || '\0' == r)
+ return(0);
+
+ /* Skip a number on either side of the hyphen. */
+ if (isdigit((unsigned char)r) || isdigit((unsigned char)l))
return(0);
+
/* Skip first/last character of word. */
- if ('\t' == *(c + 1) || '\t' == *(c - 1))
+ if ('\t' == r || '\t' == l)
return(0);
- if (' ' == *(c + 1) || ' ' == *(c - 1))
+
+ if (' ' == r || ' ' == l)
return(0);
+
/* Skip double invocations. */
- if ('-' == *(c + 1) || '-' == *(c - 1))
+ if ('-' == r || '-' == l)
return(0);
+
/* Skip escapes. */
- if ('\\' == *(c - 1))
+ if ('\\' == l)
return(0);
return(1);