diff options
author | wlemb <wlemb> | 2002-03-15 21:56:23 +0000 |
---|---|---|
committer | wlemb <wlemb> | 2002-03-15 21:56:23 +0000 |
commit | e68e47984bd71dd6a23618a6bd55dc1feea9d4e2 (patch) | |
tree | 6c0acc91e3e6ebdf6b25c3aa6a3b55afff31b3d3 /src | |
parent | 6b7180658989cef0e717899601b0d47ee3dab8a2 (diff) | |
download | groff-e68e47984bd71dd6a23618a6bd55dc1feea9d4e2.tar.gz |
Add request `trin' (translate input) to make `.asciify' work
correctly. This is necessary since `charXXX' entity names are no
longer hardcoded in font definition files.
* src/roff/troff/charinfo.h (charinfo): Add `asciify_code' and
`translate_input' members.
(charinfo::set_asciify_code, charinfo::get_asciify_code,
charinfo::set_translation_input): New methods.
(charinfo::set_translation): Add third argument.
* src/roff/troff/input.cc (charinfo:set_translation): Set
`asciify_code'.
(do_translate): Add second argument.
(translate_input): New function.
(init_input_requests): Updated.
* src/roff/troff/node.cc (glyph_node::asciify,
composite_node::asciify): Use `get_asciify_code'.
* tmac/cp1047.tmac, tmac/latin1.tmac: Use `trin'.
* NEWS, man/groff.man, man/groff_diff.man: Updated.
Diffstat (limited to 'src')
-rw-r--r-- | src/roff/troff/charinfo.h | 23 | ||||
-rw-r--r-- | src/roff/troff/input.cc | 35 | ||||
-rw-r--r-- | src/roff/troff/node.cc | 8 |
3 files changed, 53 insertions, 13 deletions
diff --git a/src/roff/troff/charinfo.h b/src/roff/troff/charinfo.h index 048d6266..68ae25eb 100644 --- a/src/roff/troff/charinfo.h +++ b/src/roff/troff/charinfo.h @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002 + Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -30,9 +31,12 @@ class charinfo { unsigned char hyphenation_code; unsigned char flags; unsigned char ascii_code; + unsigned char asciify_code; char not_found; - char transparent_translate; // non-zero means translation applies to + char transparent_translate; // non-zero means translation applies // to transparent throughput + char translate_input; // non-zero means that asciify_code is + // active for .asciify (set by .trin) char fallback; public: enum { @@ -62,10 +66,13 @@ public: int transparent(); unsigned char get_hyphenation_code(); unsigned char get_ascii_code(); + unsigned char get_asciify_code(); void set_hyphenation_code(unsigned char); void set_ascii_code(unsigned char); + void set_asciify_code(unsigned char); + void set_translation_input(); charinfo *get_translation(int = 0); - void set_translation(charinfo *, int); + void set_translation(charinfo *, int, int); void set_flags(unsigned char); void set_special_translation(int, int); int get_special_translation(int = 0); @@ -140,6 +147,11 @@ inline unsigned char charinfo::get_ascii_code() return ascii_code; } +inline unsigned char charinfo::get_asciify_code() +{ + return (translate_input ? asciify_code : 0); +} + inline void charinfo::set_flags(unsigned char c) { flags = c; @@ -150,6 +162,11 @@ inline int charinfo::get_index() return index; } +inline void charinfo::set_translation_input() +{ + translate_input = 1; +} + inline int charinfo::get_special_translation(int transparent_throughput) { return (transparent_throughput && !transparent_translate diff --git a/src/roff/troff/input.cc b/src/roff/troff/input.cc index ba60eb38..c7389888 100644 --- a/src/roff/troff/input.cc +++ b/src/roff/troff/input.cc @@ -5598,7 +5598,7 @@ static void init_charset_table() page_character = charset_table['%']; } -static void do_translate(int translate_transparent) +static void do_translate(int translate_transparent, int translate_input) { tok.skip(); while (!tok.newline() && !tok.eof()) { @@ -5637,9 +5637,9 @@ static void do_translate(int translate_transparent) if (ci2 == 0) break; if (ci1 == ci2) - ci1->set_translation(0, translate_transparent); + ci1->set_translation(0, translate_transparent, translate_input); else - ci1->set_translation(ci2, translate_transparent); + ci1->set_translation(ci2, translate_transparent, translate_input); } tok.next(); } @@ -5648,12 +5648,17 @@ static void do_translate(int translate_transparent) void translate() { - do_translate(1); + do_translate(1, 0); } void translate_no_transparent() { - do_translate(0); + do_translate(0, 0); +} + +void translate_input() +{ + do_translate(1, 1); } void char_flags() @@ -6725,6 +6730,7 @@ void init_input_requests() init_request("blm", blank_line_macro); init_request("tr", translate); init_request("trnt", translate_no_transparent); + init_request("trin", translate_input); init_request("ab", abort_request); init_request("pi", pipe_output); init_request("cf", copy_file); @@ -7152,8 +7158,9 @@ int charinfo::next_index = 0; charinfo::charinfo(symbol s) : translation(0), mac(0), special_translation(TRANSLATE_NONE), - hyphenation_code(0), flags(0), ascii_code(0), not_found(0), - transparent_translate(1), fallback(0), nm(s) + hyphenation_code(0), flags(0), ascii_code(0), asciify_code(0), + not_found(0), transparent_translate(1), translate_input(0), + fallback(0), nm(s) { index = next_index++; } @@ -7163,9 +7170,16 @@ void charinfo::set_hyphenation_code(unsigned char c) hyphenation_code = c; } -void charinfo::set_translation(charinfo *ci, int tt) +void charinfo::set_translation(charinfo *ci, int tt, int ti) { translation = ci; + if (ci && ti) { + if (asciify_code != 0) + ci->set_asciify_code(asciify_code); + else if (ascii_code != 0) + ci->set_asciify_code(ascii_code); + ci->set_translation_input(); + } special_translation = TRANSLATE_NONE; transparent_translate = tt; } @@ -7182,6 +7196,11 @@ void charinfo::set_ascii_code(unsigned char c) ascii_code = c; } +void charinfo::set_asciify_code(unsigned char c) +{ + asciify_code = c; +} + macro *charinfo::set_macro(macro *m, int f) { macro *tem = mac; diff --git a/src/roff/troff/node.cc b/src/roff/troff/node.cc index e894736a..76db8cad 100644 --- a/src/roff/troff/node.cc +++ b/src/roff/troff/node.cc @@ -3171,7 +3171,9 @@ void node::asciify(macro *m) void glyph_node::asciify(macro *m) { - unsigned char c = ci->get_ascii_code(); + unsigned char c = ci->get_asciify_code(); + if (c == 0) + c = ci->get_ascii_code(); if (c != 0) { m->append(c); delete this; @@ -3893,7 +3895,9 @@ hyphenation_type composite_node::get_hyphenation_type() void composite_node::asciify(macro *m) { - unsigned char c = ci->get_ascii_code(); + unsigned char c = ci->get_asciify_code(); + if (c == 0) + c = ci->get_ascii_code(); if (c != 0) { m->append(c); delete this; |