wl pushed a commit to branch master in repository groff. commit 4b299723a61cfa2dc8ff57224d681b42e5d10ded Author: Werner Lemberg <w...@gnu.org> Date: Fri Mar 2 18:56:42 2018 +0100
Hyphenation exceptions in pattern files now obey `.hy' (#53196). * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Mark `\hyphenation' entries with a trailing space. (hyphen_trie::insert_hyphenation): Updated. (hyphenate): Make `\hyphenation' entries obey `.hy' restrictions. * doc/groff.texi (.hy): Updated. --- ChangeLog | 11 +++++++ doc/groff.texi | 4 +++ src/roff/troff/env.cpp | 89 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6b6b717..25b6629 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2018-03-02 Werner LEMBERG <w...@gnu.org> + + Hyphenation exceptions in pattern files now obey `.hy' (#53196). + + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Mark + `\hyphenation' entries with a trailing space. + (hyphen_trie::insert_hyphenation): Updated. + (hyphenate): Make `\hyphenation' entries obey `.hy' restrictions. + + * doc/groff.texi (.hy): Updated. + 2018-03-01 Werner LEMBERG <w...@gnu.org> Adjust `.hy' values. diff --git a/doc/groff.texi b/doc/groff.texi index c4af28f..cbaf495 100644 --- a/doc/groff.texi +++ b/doc/groff.texi @@ -7052,6 +7052,10 @@ corresponds to value@tie{}4. Consequently, @code{hy}'s default value@tie{}1 or even setting values 16 or@tie{}32 might lead to (additional) incorrect hyphenation points. +Hyphenation exceptions within pattern files (i.e., the words within a +@code{\hyphenation} group) also obey the hyphenation restrictions given +by @code{hy}. However, exceptions specified with the @code{hw} do not. + @cindex hyphenation restrictions register (@code{.hy}) The current hyphenation restrictions can be found in the read-only number register @samp{.hy}. diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp index e22d235..4ffc6e8 100644 --- a/src/roff/troff/env.cpp +++ b/src/roff/troff/env.cpp @@ -3685,7 +3685,7 @@ void hyphen_trie::insert_pattern(const char *pat, int patlen, int *num) void hyphen_trie::insert_hyphenation(dictionary *ex, const char *pat, int patlen) { - char buf[WORD_MAX + 1]; + char buf[WORD_MAX + 2]; unsigned char pos[WORD_MAX + 2]; int i = 0, j = 0; int npos = 0; @@ -3695,6 +3695,8 @@ void hyphen_trie::insert_hyphenation(dictionary *ex, const char *pat, if (i > 0 && (npos == 0 || pos[npos - 1] != i)) pos[npos++] = i; } + else if (c == ' ') + buf[i++] = ' '; else buf[i++] = hpf_code_table[c]; } @@ -3815,10 +3817,10 @@ void hyphen_trie::read_patterns_file(const char *name, int append, { if (!append) clear(); - char buf[WORD_MAX]; - for (int i = 0; i < WORD_MAX; i++) + char buf[WORD_MAX + 1]; + for (int i = 0; i < WORD_MAX + 1; i++) buf[i] = 0; - int num[WORD_MAX+1]; + int num[WORD_MAX + 1]; errno = 0; char *path = 0; FILE *fp = mac_path->open_file(name, &path); @@ -3938,6 +3940,9 @@ void hyphen_trie::read_patterns_file(const char *name, int append, final_pattern = 0; } else if (have_hyphenation || final_hyphenation) { + // hyphenation exceptions in a pattern file are subject to `.hy' + // restrictions; we mark such entries with a trailing space + buf[i++] = ' '; insert_hyphenation(ex, buf, i); final_hyphenation = 0; } @@ -3967,6 +3972,7 @@ void hyphenate(hyphen_list *h, unsigned flags) } hyphen_list *nexth = tem; if (len >= 2) { + // check `.hw' entries buf[len] = 0; unsigned char *pos = (unsigned char *)current_language->exceptions.lookup(buf); @@ -3980,26 +3986,61 @@ void hyphenate(hyphen_list *h, unsigned flags) } } else { - hbuf[0] = hbuf[len + 1] = '.'; - int num[WORD_MAX + 3]; - current_language->patterns.hyphenate(hbuf, len + 2, num); - // The position of a hyphenation point gets marked with an odd - // number. Example: - // - // hbuf: . h e l p f u l . - // num: 0 0 0 0 0 1 0 0 0 0 - if (!(flags & HYPHEN_FIRST_CHAR)) - num[2] = 0; - if (flags & HYPHEN_NOT_FIRST_CHARS) - num[3] = 0; - if (flags & HYPHEN_LAST_CHAR) - ++len; - if (flags & HYPHEN_NOT_LAST_CHARS) - --len; - int i; - for (i = 2, tem = h; i < len && tem; tem = tem->next, i++) - if (num[i] & 1) - tem->hyphen = 1; + // check `\hyphenation' entries from pattern files; + // such entries are marked with a trailing space + buf[len] = ' '; + buf[len + 1] = 0; + pos = (unsigned char *)current_language->exceptions.lookup(buf); + if (pos != 0) { + int j = 0; + int i = 1; + tem = h; + if (pos[j] == i) { + if (flags & HYPHEN_FIRST_CHAR) + tem->hyphen = 1; + j++; + } + tem = tem->next; + i++; + if (pos[j] == i) { + if (!(flags & HYPHEN_NOT_FIRST_CHARS)) + tem->hyphen = 1; + j++; + } + tem = tem->next; + i++; + if (!(flags & HYPHEN_LAST_CHAR)) + --len; + if (flags & HYPHEN_NOT_LAST_CHARS) + --len; + for (; i < len && tem; tem = tem->next, i++) + if (pos[j] == i) { + tem->hyphen = 1; + j++; + } + } + else { + hbuf[0] = hbuf[len + 1] = '.'; + int num[WORD_MAX + 3]; + current_language->patterns.hyphenate(hbuf, len + 2, num); + // The position of a hyphenation point gets marked with an odd + // number. Example: + // + // hbuf: . h e l p f u l . + // num: 0 0 0 0 0 1 0 0 0 0 + if (!(flags & HYPHEN_FIRST_CHAR)) + num[2] = 0; + if (flags & HYPHEN_NOT_FIRST_CHARS) + num[3] = 0; + if (flags & HYPHEN_LAST_CHAR) + ++len; + if (flags & HYPHEN_NOT_LAST_CHARS) + --len; + int i; + for (i = 2, tem = h; i < len && tem; tem = tem->next, i++) + if (num[i] & 1) + tem->hyphen = 1; + } } } h = nexth; _______________________________________________ Groff-commit mailing list Groff-commit@gnu.org https://lists.gnu.org/mailman/listinfo/groff-commit