1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
// -*- C++ -*-
/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
Written by James Clark (jjc@jclark.com)
This file is part of groff.
groff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
groff is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with groff; see the file COPYING. If not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
struct charinfo;
struct node;
struct vunits;
class token {
symbol nm;
node *nd;
unsigned char c;
#ifdef NIPPON
wchar wc;
#endif
int val;
units dim;
enum token_type {
TOKEN_BACKSPACE,
TOKEN_BEGIN_TRAP,
TOKEN_CHAR, // a normal printing character
#ifdef NIPPON
TOKEN_WCHAR, // a japanese EUC character
#endif
TOKEN_DUMMY,
TOKEN_EMPTY, // this is the initial value
TOKEN_END_TRAP,
TOKEN_ESCAPE, // \e
TOKEN_HYPHEN_INDICATOR,
TOKEN_INTERRUPT, // \c
TOKEN_ITALIC_CORRECTION, // \/
TOKEN_LEADER, // ^A
TOKEN_LEFT_BRACE,
TOKEN_MARK_INPUT, // \k -- `nm' is the name of the register
TOKEN_NEWLINE, // newline
TOKEN_NODE,
TOKEN_NUMBERED_CHAR,
TOKEN_PAGE_EJECTOR,
TOKEN_REQUEST,
TOKEN_RIGHT_BRACE,
TOKEN_SPACE, // ` ' -- ordinary space
TOKEN_SPECIAL, // a special character -- \' \` \- \(xx
TOKEN_SPREAD, // \p -- break and spread output line
TOKEN_TAB, // tab
TOKEN_TRANSPARENT, // \!
TOKEN_EOF // end of file
} type;
public:
token();
~token();
token(const token &);
void operator=(const token &);
void next();
void process();
void skip();
int eof();
int nspaces(); // 1 if space, 2 if double space, 0 otherwise
int space(); // is it a space or double space?
int white_space(); // is the current token space or tab?
int newline(); // is the current token a newline?
int tab(); // is the current token a tab?
int leader();
int backspace();
int delimiter(int warn = 0); // is it suitable for use as a delimiter?
int dummy();
int transparent();
int left_brace();
int right_brace();
int page_ejector();
int hyphen_indicator();
int operator==(const token &); // need this for delimiters, and for conditions
int operator!=(const token &); // ditto
unsigned char ch();
charinfo *get_char(int required = 0);
int add_to_node_list(node **);
int title();
void make_space();
void make_newline();
const char *description();
friend void process_input_stack();
};
extern token tok; // the current token
extern symbol get_name(int required = 0);
extern symbol get_long_name(int required = 0);
extern charinfo *get_optional_char();
extern void check_missing_character();
extern void skip_line();
extern void handle_initial_title();
struct hunits;
extern void read_title_parts(node **part, hunits *part_width);
extern int get_number(units *result, unsigned char si);
extern int get_integer(int *result);
extern int get_number(units *result, unsigned char si, units prev_value);
extern int get_integer(int *result, int prev_value);
void interpolate_number_reg(symbol, int);
const char *asciify(int c);
inline int token::newline()
{
return type == TOKEN_NEWLINE;
}
inline int token::space()
{
return type == TOKEN_SPACE;
}
inline int token::nspaces()
{
if (type == TOKEN_SPACE)
return 1;
else
return 0;
}
inline int token::white_space()
{
return type == TOKEN_SPACE || type == TOKEN_TAB;
}
inline int token::transparent()
{
return type == TOKEN_TRANSPARENT;
}
inline int token::page_ejector()
{
return type == TOKEN_PAGE_EJECTOR;
}
inline unsigned char token::ch()
{
return type == TOKEN_CHAR ? c : 0;
}
inline int token::eof()
{
return type == TOKEN_EOF;
}
inline int token::dummy()
{
return type == TOKEN_DUMMY;
}
inline int token::left_brace()
{
return type == TOKEN_LEFT_BRACE;
}
inline int token::right_brace()
{
return type == TOKEN_RIGHT_BRACE;
}
inline int token::tab()
{
return type == TOKEN_TAB;
}
inline int token::leader()
{
return type == TOKEN_LEADER;
}
inline int token::backspace()
{
return type == TOKEN_BACKSPACE;
}
inline int token::hyphen_indicator()
{
return type == TOKEN_HYPHEN_INDICATOR;
}
int has_arg();
|