summaryrefslogtreecommitdiffstats
path: root/src/roff/troff/token.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/roff/troff/token.h')
-rw-r--r--src/roff/troff/token.h249
1 files changed, 249 insertions, 0 deletions
diff --git a/src/roff/troff/token.h b/src/roff/troff/token.h
new file mode 100644
index 0000000..bd76055
--- /dev/null
+++ b/src/roff/troff/token.h
@@ -0,0 +1,249 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+class charinfo;
+struct node;
+class vunits;
+
+class token {
+ symbol nm;
+ node *nd;
+ unsigned char c;
+ int val;
+ units dim;
+ enum token_type {
+ TOKEN_BACKSPACE,
+ TOKEN_BEGIN_TRAP,
+ TOKEN_CHAR, // a normal printing character
+ 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 \[xxx]
+ TOKEN_SPREAD, // \p -- break and spread output line
+ TOKEN_STRETCHABLE_SPACE, // \~
+ TOKEN_UNSTRETCHABLE_SPACE, // '\ '
+ TOKEN_HORIZONTAL_SPACE, // \|, \^, \0, \h
+ TOKEN_TAB, // tab
+ TOKEN_TRANSPARENT, // \!
+ TOKEN_TRANSPARENT_DUMMY, // \)
+ TOKEN_ZERO_WIDTH_BREAK, // \:
+ TOKEN_EOF // end of file
+ } type;
+public:
+ token();
+ ~token();
+ token(const token &);
+ void operator=(const token &);
+ void next();
+ void process();
+ void skip();
+ int nspaces(); // 1 if space, 0 otherwise
+ bool is_eof();
+ bool is_space();
+ bool is_stretchable_space();
+ bool is_unstretchable_space();
+ bool is_horizontal_space();
+ bool is_white_space();
+ bool is_special();
+ bool is_newline();
+ bool is_tab();
+ bool is_leader();
+ bool is_backspace();
+ bool usable_as_delimiter(bool = false);
+ bool is_dummy();
+ bool is_transparent_dummy();
+ bool is_transparent();
+ bool is_left_brace();
+ bool is_right_brace();
+ bool is_page_ejector();
+ bool is_hyphen_indicator();
+ bool is_zero_width_break();
+ int operator==(const token &); // need this for delimiters, and for conditions
+ int operator!=(const token &); // ditto
+ unsigned char ch();
+ charinfo *get_char(bool = false);
+ int add_to_zero_width_node_list(node **);
+ void make_space();
+ void make_newline();
+ const char *description();
+
+ friend void process_input_stack();
+ friend node *do_overstrike();
+};
+
+extern token tok; // the current token
+
+extern symbol get_name(bool = false);
+extern symbol get_long_name(bool = false);
+extern charinfo *get_optional_char();
+extern char *read_string();
+extern void check_missing_character();
+extern void skip_line();
+extern void handle_initial_title();
+
+enum char_mode {
+ CHAR_NORMAL,
+ CHAR_FALLBACK,
+ CHAR_FONT_SPECIAL,
+ CHAR_SPECIAL
+};
+
+extern void do_define_character(char_mode, const char * = 0);
+
+class hunits;
+extern void read_title_parts(node **part, hunits *part_width);
+
+extern int get_number_rigidly(units *result, unsigned char si);
+
+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 bool token::is_newline()
+{
+ return type == TOKEN_NEWLINE;
+}
+
+inline bool token::is_space()
+{
+ return type == TOKEN_SPACE;
+}
+
+inline bool token::is_stretchable_space()
+{
+ return type == TOKEN_STRETCHABLE_SPACE;
+}
+
+inline bool token::is_unstretchable_space()
+{
+ return type == TOKEN_UNSTRETCHABLE_SPACE;
+}
+
+inline bool token::is_horizontal_space()
+{
+ return type == TOKEN_HORIZONTAL_SPACE;
+}
+
+inline bool token::is_special()
+{
+ return type == TOKEN_SPECIAL;
+}
+
+inline int token::nspaces()
+{
+ return (int)(type == TOKEN_SPACE);
+}
+
+inline bool token::is_white_space()
+{
+ return type == TOKEN_SPACE || type == TOKEN_TAB;
+}
+
+inline bool token::is_transparent()
+{
+ return type == TOKEN_TRANSPARENT;
+}
+
+inline bool token::is_page_ejector()
+{
+ return type == TOKEN_PAGE_EJECTOR;
+}
+
+inline unsigned char token::ch()
+{
+ return type == TOKEN_CHAR ? c : 0;
+}
+
+inline bool token::is_eof()
+{
+ return type == TOKEN_EOF;
+}
+
+inline bool token::is_dummy()
+{
+ return type == TOKEN_DUMMY;
+}
+
+inline bool token::is_transparent_dummy()
+{
+ return type == TOKEN_TRANSPARENT_DUMMY;
+}
+
+inline bool token::is_left_brace()
+{
+ return type == TOKEN_LEFT_BRACE;
+}
+
+inline bool token::is_right_brace()
+{
+ return type == TOKEN_RIGHT_BRACE;
+}
+
+inline bool token::is_tab()
+{
+ return type == TOKEN_TAB;
+}
+
+inline bool token::is_leader()
+{
+ return type == TOKEN_LEADER;
+}
+
+inline bool token::is_backspace()
+{
+ return type == TOKEN_BACKSPACE;
+}
+
+inline bool token::is_hyphen_indicator()
+{
+ return type == TOKEN_HYPHEN_INDICATOR;
+}
+
+inline bool token::is_zero_width_break()
+{
+ return type == TOKEN_ZERO_WIDTH_BREAK;
+}
+
+bool has_arg();
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72: