1/*	$NetBSD$	*/
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
8This file is part of groff.
9
10groff is free software; you can redistribute it and/or modify it under
11the terms of the GNU General Public License as published by the Free
12Software Foundation; either version 2, or (at your option) any later
13version.
14
15groff is distributed in the hope that it will be useful, but WITHOUT ANY
16WARRANTY; without even the implied warranty of MERCHANTABILITY or
17FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18for more details.
19
20You should have received a copy of the GNU General Public License along
21with groff; see the file COPYING.  If not, write to the Free Software
22Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
23
24class macro;
25
26class 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;
43public:
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
95charinfo *get_charinfo(symbol);
96extern charinfo *charset_table[];
97charinfo *get_charinfo_by_number(int);
98
99inline int charinfo::overlaps_horizontally()
100{
101  return flags & OVERLAPS_HORIZONTALLY;
102}
103
104inline int charinfo::overlaps_vertically()
105{
106  return flags & OVERLAPS_VERTICALLY;
107}
108
109inline int charinfo::can_break_before()
110{
111  return flags & BREAK_BEFORE;
112}
113
114inline int charinfo::can_break_after()
115{
116  return flags & BREAK_AFTER;
117}
118
119inline int charinfo::ends_sentence()
120{
121  return flags & ENDS_SENTENCE;
122}
123
124inline int charinfo::transparent()
125{
126  return flags & TRANSPARENT;
127}
128
129inline int charinfo::numbered()
130{
131  return flags & NUMBERED;
132}
133
134inline int charinfo::is_normal()
135{
136  return mode == CHAR_NORMAL;
137}
138
139inline int charinfo::is_fallback()
140{
141  return mode == CHAR_FALLBACK;
142}
143
144inline int charinfo::is_special()
145{
146  return mode == CHAR_SPECIAL;
147}
148
149inline charinfo *charinfo::get_translation(int transparent_throughput)
150{
151  return (transparent_throughput && !transparent_translate
152	  ? 0
153	  : translation);
154}
155
156inline unsigned char charinfo::get_hyphenation_code()
157{
158  return hyphenation_code;
159}
160
161inline unsigned char charinfo::get_ascii_code()
162{
163  return ascii_code;
164}
165
166inline unsigned char charinfo::get_asciify_code()
167{
168  return (translate_input ? asciify_code : 0);
169}
170
171inline void charinfo::set_flags(unsigned char c)
172{
173  flags = c;
174}
175
176inline int charinfo::get_index()
177{
178  return index;
179}
180
181inline void charinfo::set_translation_input()
182{
183  translate_input = 1;
184}
185
186inline int charinfo::get_translation_input()
187{
188  return translate_input;
189}
190
191inline int charinfo::get_special_translation(int transparent_throughput)
192{
193  return (transparent_throughput && !transparent_translate
194	  ? int(TRANSLATE_NONE)
195	  : special_translation);
196}
197
198inline macro *charinfo::get_macro()
199{
200  return mac;
201}
202
203inline 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
213inline symbol *charinfo::get_symbol()
214{
215  return( &nm );
216}
217