diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-07-27 07:06:29 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-07-27 07:06:29 +0000 |
commit | 6623ec2f152206d69c4d01dd3cc346f52dcf85df (patch) | |
tree | 570e7bed51d8a463e3091598e11187fe9ad4e900 /mandoc.c | |
parent | 571a801caad4d1a19d985099b0ffa469a25de5a1 (diff) | |
download | mandoc-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.c | 29 |
1 files changed, 20 insertions, 9 deletions
@@ -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); |