1 /* $NetBSD: charinfo.h,v 1.1.1.1 2016/01/13 18:41:48 christos Exp $ */
2
3 // -*- C++ -*-
4 /* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002
5 Free Software Foundation, Inc.
6 Written by James Clark (jjc@jclark.com)
7
8 This file is part of groff.
9
10 groff is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2, or (at your option) any later
13 version.
14
15 groff is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License along
21 with groff; see the file COPYING. If not, write to the Free Software
22 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
23
24 class macro;
25
26 class charinfo {
27 static int next_index;
28 charinfo *translation;
29 int index;
30 int number;
31 macro *mac;
32 unsigned char special_translation;
33 unsigned char hyphenation_code;
34 unsigned char flags;
35 unsigned char ascii_code;
36 unsigned char asciify_code;
37 char not_found;
38 char transparent_translate; // non-zero means translation applies
39 // to transparent throughput
40 char translate_input; // non-zero means that asciify_code is
41 // active for .asciify (set by .trin)
42 char_mode mode;
43 public:
44 enum {
45 ENDS_SENTENCE = 1,
46 BREAK_BEFORE = 2,
47 BREAK_AFTER = 4,
48 OVERLAPS_HORIZONTALLY = 8,
49 OVERLAPS_VERTICALLY = 16,
50 TRANSPARENT = 32,
51 NUMBERED = 64
52 };
53 enum {
54 TRANSLATE_NONE,
55 TRANSLATE_SPACE,
56 TRANSLATE_DUMMY,
57 TRANSLATE_STRETCHABLE_SPACE,
58 TRANSLATE_HYPHEN_INDICATOR
59 };
60 symbol nm;
61 charinfo(symbol s);
62 int get_index();
63 int ends_sentence();
64 int overlaps_vertically();
65 int overlaps_horizontally();
66 int can_break_before();
67 int can_break_after();
68 int transparent();
69 unsigned char get_hyphenation_code();
70 unsigned char get_ascii_code();
71 unsigned char get_asciify_code();
72 void set_hyphenation_code(unsigned char);
73 void set_ascii_code(unsigned char);
74 void set_asciify_code(unsigned char);
75 void set_translation_input();
76 int get_translation_input();
77 charinfo *get_translation(int = 0);
78 void set_translation(charinfo *, int, int);
79 void set_flags(unsigned char);
80 void set_special_translation(int, int);
81 int get_special_translation(int = 0);
82 macro *set_macro(macro *);
83 macro *setx_macro(macro *, char_mode);
84 macro *get_macro();
85 int first_time_not_found();
86 void set_number(int);
87 int get_number();
88 int numbered();
89 int is_normal();
90 int is_fallback();
91 int is_special();
92 symbol *get_symbol();
93 };
94
95 charinfo *get_charinfo(symbol);
96 extern charinfo *charset_table[];
97 charinfo *get_charinfo_by_number(int);
98
overlaps_horizontally()99 inline int charinfo::overlaps_horizontally()
100 {
101 return flags & OVERLAPS_HORIZONTALLY;
102 }
103
overlaps_vertically()104 inline int charinfo::overlaps_vertically()
105 {
106 return flags & OVERLAPS_VERTICALLY;
107 }
108
can_break_before()109 inline int charinfo::can_break_before()
110 {
111 return flags & BREAK_BEFORE;
112 }
113
can_break_after()114 inline int charinfo::can_break_after()
115 {
116 return flags & BREAK_AFTER;
117 }
118
ends_sentence()119 inline int charinfo::ends_sentence()
120 {
121 return flags & ENDS_SENTENCE;
122 }
123
transparent()124 inline int charinfo::transparent()
125 {
126 return flags & TRANSPARENT;
127 }
128
numbered()129 inline int charinfo::numbered()
130 {
131 return flags & NUMBERED;
132 }
133
is_normal()134 inline int charinfo::is_normal()
135 {
136 return mode == CHAR_NORMAL;
137 }
138
is_fallback()139 inline int charinfo::is_fallback()
140 {
141 return mode == CHAR_FALLBACK;
142 }
143
is_special()144 inline int charinfo::is_special()
145 {
146 return mode == CHAR_SPECIAL;
147 }
148
get_translation(int transparent_throughput)149 inline charinfo *charinfo::get_translation(int transparent_throughput)
150 {
151 return (transparent_throughput && !transparent_translate
152 ? 0
153 : translation);
154 }
155
get_hyphenation_code()156 inline unsigned char charinfo::get_hyphenation_code()
157 {
158 return hyphenation_code;
159 }
160
get_ascii_code()161 inline unsigned char charinfo::get_ascii_code()
162 {
163 return ascii_code;
164 }
165
get_asciify_code()166 inline unsigned char charinfo::get_asciify_code()
167 {
168 return (translate_input ? asciify_code : 0);
169 }
170
set_flags(unsigned char c)171 inline void charinfo::set_flags(unsigned char c)
172 {
173 flags = c;
174 }
175
get_index()176 inline int charinfo::get_index()
177 {
178 return index;
179 }
180
set_translation_input()181 inline void charinfo::set_translation_input()
182 {
183 translate_input = 1;
184 }
185
get_translation_input()186 inline int charinfo::get_translation_input()
187 {
188 return translate_input;
189 }
190
get_special_translation(int transparent_throughput)191 inline int charinfo::get_special_translation(int transparent_throughput)
192 {
193 return (transparent_throughput && !transparent_translate
194 ? int(TRANSLATE_NONE)
195 : special_translation);
196 }
197
get_macro()198 inline macro *charinfo::get_macro()
199 {
200 return mac;
201 }
202
first_time_not_found()203 inline int charinfo::first_time_not_found()
204 {
205 if (not_found)
206 return 0;
207 else {
208 not_found = 1;
209 return 1;
210 }
211 }
212
get_symbol()213 inline symbol *charinfo::get_symbol()
214 {
215 return( &nm );
216 }
217