summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwlemb <wlemb>2002-03-15 21:56:23 +0000
committerwlemb <wlemb>2002-03-15 21:56:23 +0000
commite68e47984bd71dd6a23618a6bd55dc1feea9d4e2 (patch)
tree6c0acc91e3e6ebdf6b25c3aa6a3b55afff31b3d3 /src
parent6b7180658989cef0e717899601b0d47ee3dab8a2 (diff)
downloadgroff-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.h23
-rw-r--r--src/roff/troff/input.cc35
-rw-r--r--src/roff/troff/node.cc8
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;