void tex::append_discretionary () { int c; tail_append(new_disc()); if (cur_chr == 1) { c = hyphen_char(cur_font); if (c >= 0 && c < 256) pre_break(tail) = new_character(cur_font, c); } else { incr(save_ptr); saved(-1) = 0; scan_left_brace(); new_save_level(DISC_GROUP); push_nest(); mode = -HMODE; space_factor = 1000; } }
void try_hyph () { int c, j; ptr prev_p, p, q; prev_p = cur_p; p = link(cur_p); if (p != null) { loop { if (is_char_node(p)) { c = character(p); hf = font(p); } else if (type(p) == LIGATURE_NODE) { if (lig_ptr(p) == null) goto contin; q = lig_ptr(p); c = character(q); hf = font(q); } else if (type(p) == KERN_NODE && subtype(p) == NORMAL) { goto contin; } else if (type(p) == WHATSIT_NODE) { try_hyph_whatsit(p); goto contin; } else { goto done1; } if (lc_code(c) != 0) { if (lc_code(c) == c || uc_hyph > 0) { goto done2; } else { goto done1; } } contin: prev_p = p; p = link(p); } done2: hyf_char = hyphen_char(hf); if (hyf_char < 0 || hyf_char > 255) goto done1; ha = prev_p; if (l_hyf + r_hyf > 63) goto done1; hn = 0; loop { if (is_char_node(p)) { if (font(p) != hf) goto done3; c = character(p); if (lc_code(c) == 0 || hn == 63) goto done3; hb = p; incr(hn); hu[hn] = c; hc[hn] = lc_code(c); } else if (type(p) == LIGATURE_NODE) { if (font(lig_char(p)) != hf) goto done3; j = hn; q = lig_ptr(p); while (q != null) { c = character(q); if (lc_code(c) == 0 || j == 63) goto done3; incr(j); hu[j] = c; hc[j] = lc_code(c); q = link(q); } hb = p; hn = j; } else if (type(p) != KERN_NODE || subtype(p) != NORMAL) { goto done3; } p = link(p); } done3: if (hn < l_hyf + r_hyf) goto done1; loop { if (!is_char_node(p)) { switch (type(p)) { case LIGATURE_NODE: break; case KERN_NODE: if (subtype(p) != NORMAL) goto done4; break; case WHATSIT_NODE: case GLUE_NODE: case PENALTY_NODE: case INS_NODE: case ADJUST_NODE: case MARK_NODE: goto done4; default: goto done1; } } p = link(p); } done4: hyphenate(); }