xref: /netbsd-src/external/gpl2/groff/dist/src/roff/troff/charinfo.h (revision 89a07cf815a29524268025a1139fac4c5190f765)
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