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