PageRenderTime 33ms CodeModel.GetById 13ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/groff/src/roff/troff/token.h

https://bitbucket.org/freebsd/freebsd-head/
C++ Header | 242 lines | 187 code | 35 blank | 20 comment | 23 complexity | de281a489a06ad6061d963bc5de6c4d4 MD5 | raw file
  1// -*- C++ -*-
  2/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004
  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
 22
 23class charinfo;
 24struct node;
 25class vunits;
 26
 27class token {
 28  symbol nm;
 29  node *nd;
 30  unsigned char c;
 31  int val;
 32  units dim;
 33  enum token_type {
 34    TOKEN_BACKSPACE,
 35    TOKEN_BEGIN_TRAP,
 36    TOKEN_CHAR,			// a normal printing character
 37    TOKEN_DUMMY,		// \&
 38    TOKEN_EMPTY,		// this is the initial value
 39    TOKEN_END_TRAP,
 40    TOKEN_ESCAPE,		// \e
 41    TOKEN_HYPHEN_INDICATOR,
 42    TOKEN_INTERRUPT,		// \c
 43    TOKEN_ITALIC_CORRECTION,	// \/
 44    TOKEN_LEADER,		// ^A
 45    TOKEN_LEFT_BRACE,
 46    TOKEN_MARK_INPUT,		// \k -- `nm' is the name of the register
 47    TOKEN_NEWLINE,		// newline
 48    TOKEN_NODE,
 49    TOKEN_NUMBERED_CHAR,
 50    TOKEN_PAGE_EJECTOR,
 51    TOKEN_REQUEST,
 52    TOKEN_RIGHT_BRACE,
 53    TOKEN_SPACE,		// ` ' -- ordinary space
 54    TOKEN_SPECIAL,		// a special character -- \' \` \- \(xx \[xxx]
 55    TOKEN_SPREAD,		// \p -- break and spread output line 
 56    TOKEN_STRETCHABLE_SPACE,	// \~
 57    TOKEN_UNSTRETCHABLE_SPACE,	// `\ '
 58    TOKEN_TAB,			// tab
 59    TOKEN_TRANSPARENT,		// \!
 60    TOKEN_TRANSPARENT_DUMMY,	// \)
 61    TOKEN_ZERO_WIDTH_BREAK,	// \:
 62    TOKEN_EOF			// end of file
 63  } type;
 64public:
 65  token();
 66  ~token();
 67  token(const token &);
 68  void operator=(const token &);
 69  void next();
 70  void process();
 71  void skip();
 72  int eof();
 73  int nspaces();		// 1 if space, 2 if double space, 0 otherwise
 74  int space();			// is the current token a space?
 75  int stretchable_space();	// is the current token a stretchable space?
 76  int unstretchable_space();	// is the current token an unstretchable space?
 77  int white_space();		// is the current token space or tab?
 78  int special();		// is the current token a special character?
 79  int newline();		// is the current token a newline?
 80  int tab();			// is the current token a tab?
 81  int leader();
 82  int backspace();
 83  int delimiter(int warn = 0);	// is it suitable for use as a delimiter?
 84  int dummy();
 85  int transparent_dummy();
 86  int transparent();
 87  int left_brace();
 88  int right_brace();
 89  int page_ejector();
 90  int hyphen_indicator();
 91  int zero_width_break();
 92  int operator==(const token &); // need this for delimiters, and for conditions
 93  int operator!=(const token &); // ditto
 94  unsigned char ch();
 95  charinfo *get_char(int required = 0);
 96  int add_to_node_list(node **);
 97  int title();
 98  void make_space();
 99  void make_newline();
100  const char *description();
101
102  friend void process_input_stack();
103};
104
105extern token tok;		// the current token
106
107extern symbol get_name(int required = 0);
108extern symbol get_long_name(int required = 0);
109extern charinfo *get_optional_char();
110extern char *read_string();
111extern void check_missing_character();
112extern void skip_line();
113extern void handle_initial_title();
114
115enum char_mode {
116  CHAR_NORMAL,
117  CHAR_FALLBACK,
118  CHAR_FONT_SPECIAL,
119  CHAR_SPECIAL
120};
121
122extern void do_define_character(char_mode, const char * = 0);
123
124class hunits;
125extern void read_title_parts(node **part, hunits *part_width);
126
127extern int get_number_rigidly(units *result, unsigned char si);
128
129extern int get_number(units *result, unsigned char si);
130extern int get_integer(int *result);
131
132extern int get_number(units *result, unsigned char si, units prev_value);
133extern int get_integer(int *result, int prev_value);
134
135void interpolate_number_reg(symbol, int);
136
137const char *asciify(int c);
138
139inline int token::newline()
140{ 
141  return type == TOKEN_NEWLINE; 
142}
143
144inline int token::space()
145{ 
146  return type == TOKEN_SPACE;
147}
148
149inline int token::stretchable_space()
150{
151  return type == TOKEN_STRETCHABLE_SPACE;
152}
153
154inline int token::unstretchable_space()
155{
156  return type == TOKEN_UNSTRETCHABLE_SPACE;
157}
158
159inline int token::special()
160{ 
161  return type == TOKEN_SPECIAL;
162}
163
164inline int token::nspaces()
165{
166  if (type == TOKEN_SPACE)
167    return 1;
168  else
169    return 0;
170}
171
172inline int token::white_space()
173{
174  return type == TOKEN_SPACE || type == TOKEN_TAB;
175}
176
177inline int token::transparent()
178{
179  return type == TOKEN_TRANSPARENT;
180}
181
182inline int token::page_ejector()
183{
184  return type == TOKEN_PAGE_EJECTOR;
185}
186
187inline unsigned char token::ch()
188{
189  return type == TOKEN_CHAR ? c : 0;
190} 
191
192inline int token::eof()
193{
194  return type == TOKEN_EOF;
195}
196
197inline int token::dummy()
198{
199  return type == TOKEN_DUMMY;
200}
201
202inline int token::transparent_dummy()
203{
204  return type == TOKEN_TRANSPARENT_DUMMY;
205}
206
207inline int token::left_brace()
208{
209  return type == TOKEN_LEFT_BRACE;
210}
211
212inline int token::right_brace()
213{
214  return type == TOKEN_RIGHT_BRACE;
215}
216
217inline int token::tab()
218{
219  return type == TOKEN_TAB;
220}
221
222inline int token::leader()
223{
224  return type == TOKEN_LEADER;
225}
226
227inline int token::backspace()
228{
229  return type == TOKEN_BACKSPACE;
230}
231
232inline int token::hyphen_indicator()
233{
234  return type == TOKEN_HYPHEN_INDICATOR;
235}
236
237inline int token::zero_width_break()
238{
239  return type == TOKEN_ZERO_WIDTH_BREAK;
240}
241
242int has_arg();