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