charinfo.h revision 104862
1251876Speter// -*- C++ -*-
2251876Speter/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002
3251876Speter   Free Software Foundation, Inc.
4251876Speter     Written by James Clark (jjc@jclark.com)
5251876Speter
6251876SpeterThis file is part of groff.
7251876Speter
8251876Spetergroff is free software; you can redistribute it and/or modify it under
9251876Speterthe terms of the GNU General Public License as published by the Free
10251876SpeterSoftware Foundation; either version 2, or (at your option) any later
11251876Speterversion.
12251876Speter
13251876Spetergroff is distributed in the hope that it will be useful, but WITHOUT ANY
14251876SpeterWARRANTY; without even the implied warranty of MERCHANTABILITY or
15251876SpeterFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16251876Speterfor more details.
17251876Speter
18251876SpeterYou should have received a copy of the GNU General Public License along
19251876Speterwith groff; see the file COPYING.  If not, write to the Free Software
20251876SpeterFoundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21251876Speter
22251876Speterclass macro;
23251876Speter
24251876Speterclass charinfo {
25251876Speter  static int next_index;
26251876Speter  charinfo *translation;
27251876Speter  int index;
28251876Speter  int number;
29251876Speter  macro *mac;
30251876Speter  unsigned char special_translation;
31251876Speter  unsigned char hyphenation_code;
32251876Speter  unsigned char flags;
33253734Speter  unsigned char ascii_code;
34251876Speter  unsigned char asciify_code;
35251876Speter  char not_found;
36251876Speter  char transparent_translate;	// non-zero means translation applies
37251876Speter				// to transparent throughput
38251876Speter  char translate_input;		// non-zero means that asciify_code is
39251876Speter				// active for .asciify (set by .trin)
40251876Speter  char fallback;
41251876Speterpublic:
42251876Speter  enum {
43251876Speter    ENDS_SENTENCE = 1,
44251876Speter    BREAK_BEFORE = 2,
45251876Speter    BREAK_AFTER = 4,
46251876Speter    OVERLAPS_HORIZONTALLY = 8,
47251876Speter    OVERLAPS_VERTICALLY = 16,
48251876Speter    TRANSPARENT = 32,
49251876Speter    NUMBERED = 64
50251876Speter    };
51251876Speter  enum {
52251876Speter    TRANSLATE_NONE,
53251876Speter    TRANSLATE_SPACE,
54251876Speter    TRANSLATE_DUMMY,
55251876Speter    TRANSLATE_STRETCHABLE_SPACE,
56251876Speter    TRANSLATE_HYPHEN_INDICATOR
57251876Speter  };
58251876Speter  symbol nm;
59251876Speter  charinfo(symbol s);
60251876Speter  int get_index();
61251876Speter  int ends_sentence();
62251876Speter  int overlaps_vertically();
63251876Speter  int overlaps_horizontally();
64251876Speter  int can_break_before();
65251876Speter  int can_break_after();
66251876Speter  int transparent();
67251876Speter  unsigned char get_hyphenation_code();
68251876Speter  unsigned char get_ascii_code();
69251876Speter  unsigned char get_asciify_code();
70251876Speter  void set_hyphenation_code(unsigned char);
71251876Speter  void set_ascii_code(unsigned char);
72251876Speter  void set_asciify_code(unsigned char);
73251876Speter  void set_translation_input();
74251876Speter  int get_translation_input();
75251876Speter  charinfo *get_translation(int = 0);
76251876Speter  void set_translation(charinfo *, int, int);
77251876Speter  void set_flags(unsigned char);
78251876Speter  void set_special_translation(int, int);
79251876Speter  int get_special_translation(int = 0);
80251876Speter  macro *set_macro(macro *, int = 0);
81251876Speter  macro *get_macro();
82251876Speter  int first_time_not_found();
83251876Speter  void set_number(int);
84251876Speter  int get_number();
85251876Speter  int numbered();
86251876Speter  int is_fallback();
87253734Speter  symbol *get_symbol();
88251876Speter};
89251876Speter
90253734Spetercharinfo *get_charinfo(symbol);
91253734Speterextern charinfo *charset_table[];
92253734Spetercharinfo *get_charinfo_by_number(int);
93253734Speter
94251876Speterinline int charinfo::overlaps_horizontally()
95251876Speter{
96251876Speter  return flags & OVERLAPS_HORIZONTALLY;
97253734Speter}
98251876Speter
99253734Speterinline int charinfo::overlaps_vertically()
100253734Speter{
101253734Speter  return flags & OVERLAPS_VERTICALLY;
102253734Speter}
103251876Speter
104253734Speterinline int charinfo::can_break_before()
105253734Speter{
106253734Speter  return flags & BREAK_BEFORE;
107253734Speter}
108253734Speter
109253734Speterinline int charinfo::can_break_after()
110253734Speter{
111253734Speter  return flags & BREAK_AFTER;
112253734Speter}
113253734Speter
114253734Speterinline int charinfo::ends_sentence()
115253734Speter{
116251876Speter  return flags & ENDS_SENTENCE;
117253734Speter}
118253734Speter
119253734Speterinline int charinfo::transparent()
120253734Speter{
121253734Speter  return flags & TRANSPARENT;
122253734Speter}
123253734Speter
124253734Speterinline int charinfo::numbered()
125251876Speter{
126251876Speter  return flags & NUMBERED;
127251876Speter}
128251876Speter
129251876Speterinline int charinfo::is_fallback()
130251876Speter{
131251876Speter  return fallback;
132251876Speter}
133251876Speter
134251876Speterinline charinfo *charinfo::get_translation(int transparent_throughput)
135251876Speter{
136251876Speter  return (transparent_throughput && !transparent_translate
137251876Speter	  ? 0
138251876Speter	  : translation);
139251876Speter}
140251876Speter
141251876Speterinline unsigned char charinfo::get_hyphenation_code()
142251876Speter{
143251876Speter  return hyphenation_code;
144251876Speter}
145251876Speter
146253734Speterinline unsigned char charinfo::get_ascii_code()
147251876Speter{
148253734Speter  return ascii_code;
149253734Speter}
150253734Speter
151253734Speterinline unsigned char charinfo::get_asciify_code()
152253734Speter{
153253734Speter  return (translate_input ? asciify_code : 0);
154253734Speter}
155253734Speter
156253734Speterinline void charinfo::set_flags(unsigned char c)
157253734Speter{
158253734Speter  flags = c;
159253734Speter}
160253734Speter
161253734Speterinline int charinfo::get_index()
162253734Speter{
163253734Speter  return index;
164253734Speter}
165253734Speter
166253734Speterinline void charinfo::set_translation_input()
167253734Speter{
168253734Speter  translate_input = 1;
169253734Speter}
170253734Speter
171253734Speterinline int charinfo::get_translation_input()
172253734Speter{
173253734Speter  return translate_input;
174253734Speter}
175253734Speter
176253734Speterinline int charinfo::get_special_translation(int transparent_throughput)
177253734Speter{
178253734Speter  return (transparent_throughput && !transparent_translate
179253734Speter	  ? int(TRANSLATE_NONE)
180253734Speter	  : special_translation);
181253734Speter}
182251876Speter
183251876Speterinline macro *charinfo::get_macro()
184251876Speter{
185251876Speter  return mac;
186251876Speter}
187251876Speter
188253734Speterinline int charinfo::first_time_not_found()
189251876Speter{
190251876Speter  if (not_found)
191251876Speter    return 0;
192251876Speter  else {
193251876Speter    not_found = 1;
194251876Speter    return 1;
195251876Speter  }
196251876Speter}
197251876Speter
198251876Speterinline symbol *charinfo::get_symbol()
199251876Speter{
200253734Speter  return( &nm );
201251876Speter}
202253734Speter