1 /* $NetBSD: env.h,v 1.1.1.1 2016/01/13 18:41:48 christos Exp $ */ 2 3 // -*- C++ -*- 4 /* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004, 2005 5 Free Software Foundation, Inc. 6 Written by James Clark (jjc (at) jclark.com) 7 8 This file is part of groff. 9 10 groff is free software; you can redistribute it and/or modify it under 11 the terms of the GNU General Public License as published by the Free 12 Software Foundation; either version 2, or (at your option) any later 13 version. 14 15 groff is distributed in the hope that it will be useful, but WITHOUT ANY 16 WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 18 for more details. 19 20 You should have received a copy of the GNU General Public License along 21 with groff; see the file COPYING. If not, write to the Free Software 22 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24 class statem; 25 26 struct size_range { 27 int min; 28 int max; 29 }; 30 31 class font_size { 32 static size_range *size_table; 33 static int nranges; 34 int p; 35 public: 36 font_size(); 37 font_size(int points); 38 int to_points(); 39 int to_scaled_points(); 40 int to_units(); 41 int operator==(font_size); 42 int operator!=(font_size); 43 static void init_size_table(int *sizes); 44 }; 45 46 inline font_size::font_size() : p(0) 47 { 48 } 49 50 inline int font_size::operator==(font_size fs) 51 { 52 return p == fs.p; 53 } 54 55 inline int font_size::operator!=(font_size fs) 56 { 57 return p != fs.p; 58 } 59 60 inline int font_size::to_scaled_points() 61 { 62 return p; 63 } 64 65 inline int font_size::to_points() 66 { 67 return p/sizescale; 68 } 69 70 class environment; 71 72 hunits env_digit_width(environment *); 73 hunits env_space_width(environment *); 74 hunits env_sentence_space_width(environment *); 75 hunits env_narrow_space_width(environment *); 76 hunits env_half_narrow_space_width(environment *); 77 78 struct tab; 79 80 enum tab_type { TAB_NONE, TAB_LEFT, TAB_CENTER, TAB_RIGHT }; 81 82 class tab_stops { 83 tab *initial_list; 84 tab *repeated_list; 85 public: 86 tab_stops(); 87 tab_stops(hunits distance, tab_type type); 88 tab_stops(const tab_stops &); 89 ~tab_stops(); 90 void operator=(const tab_stops &); 91 tab_type distance_to_next_tab(hunits pos, hunits *distance); 92 tab_type distance_to_next_tab(hunits curpos, hunits *distance, hunits *leftpos); 93 void clear(); 94 void add_tab(hunits pos, tab_type type, int repeated); 95 const char *to_string(); 96 }; 97 98 const unsigned MARGIN_CHARACTER_ON = 1; 99 const unsigned MARGIN_CHARACTER_NEXT = 2; 100 101 class charinfo; 102 struct node; 103 struct breakpoint; 104 class font_family; 105 class pending_output_line; 106 107 // declarations to avoid friend name injection problems 108 void title_length(); 109 void space_size(); 110 void fill(); 111 void no_fill(); 112 void adjust(); 113 void no_adjust(); 114 void center(); 115 void right_justify(); 116 void vertical_spacing(); 117 void post_vertical_spacing(); 118 void line_spacing(); 119 void line_length(); 120 void indent(); 121 void temporary_indent(); 122 void do_underline(int); 123 void do_input_trap(int); 124 void set_tabs(); 125 void margin_character(); 126 void no_number(); 127 void number_lines(); 128 void leader_character(); 129 void tab_character(); 130 void hyphenate_request(); 131 void no_hyphenate(); 132 void hyphen_line_max_request(); 133 void hyphenation_space_request(); 134 void hyphenation_margin_request(); 135 void line_width(); 136 #if 0 137 void tabs_save(); 138 void tabs_restore(); 139 #endif 140 void line_tabs_request(); 141 void title(); 142 #ifdef WIDOW_CONTROL 143 void widow_control_request(); 144 #endif /* WIDOW_CONTROL */ 145 146 void do_divert(int append, int boxing); 147 148 class environment { 149 int dummy; // dummy environment used for \w 150 hunits prev_line_length; 151 hunits line_length; 152 hunits prev_title_length; 153 hunits title_length; 154 font_size prev_size; 155 font_size size; 156 int requested_size; 157 int prev_requested_size; 158 int char_height; 159 int char_slant; 160 int prev_fontno; 161 int fontno; 162 font_family *prev_family; 163 font_family *family; 164 int space_size; // in 36ths of an em 165 int sentence_space_size; // same but for spaces at the end of sentences 166 int adjust_mode; 167 int fill; 168 int interrupted; 169 int prev_line_interrupted; 170 int center_lines; 171 int right_justify_lines; 172 vunits prev_vertical_spacing; 173 vunits vertical_spacing; 174 vunits prev_post_vertical_spacing; 175 vunits post_vertical_spacing; 176 int prev_line_spacing; 177 int line_spacing; 178 hunits prev_indent; 179 hunits indent; 180 hunits temporary_indent; 181 int have_temporary_indent; 182 hunits saved_indent; 183 hunits target_text_length; 184 int pre_underline_fontno; 185 int underline_lines; 186 int underline_spaces; 187 symbol input_trap; 188 int input_trap_count; 189 int continued_input_trap; 190 node *line; // in reverse order 191 hunits prev_text_length; 192 hunits width_total; 193 int space_total; 194 hunits input_line_start; 195 node *tab_contents; 196 hunits tab_width; 197 hunits tab_distance; 198 int line_tabs; 199 tab_type current_tab; 200 node *leader_node; 201 charinfo *tab_char; 202 charinfo *leader_char; 203 int current_field; // is there a current field? 204 hunits field_distance; 205 hunits pre_field_width; 206 int field_spaces; 207 int tab_field_spaces; 208 int tab_precedes_field; 209 int discarding; 210 int spread_flag; // set by \p 211 unsigned margin_character_flags; 212 node *margin_character_node; 213 hunits margin_character_distance; 214 node *numbering_nodes; 215 hunits line_number_digit_width; 216 int number_text_separation; // in digit spaces 217 int line_number_indent; // in digit spaces 218 int line_number_multiple; 219 int no_number_count; 220 unsigned hyphenation_flags; 221 int hyphen_line_count; 222 int hyphen_line_max; 223 hunits hyphenation_space; 224 hunits hyphenation_margin; 225 int composite; // used for construction of composite char? 226 pending_output_line *pending_lines; 227 #ifdef WIDOW_CONTROL 228 int widow_control; 229 #endif /* WIDOW_CONTROL */ 230 color *glyph_color; 231 color *prev_glyph_color; 232 color *fill_color; 233 color *prev_fill_color; 234 235 tab_type distance_to_next_tab(hunits *); 236 tab_type distance_to_next_tab(hunits *distance, hunits *leftpos); 237 void start_line(); 238 void output_line(node *, hunits, int); 239 void output(node *nd, int retain_size, vunits vs, vunits post_vs, 240 hunits width, int was_centered); 241 void output_title(node *nd, int retain_size, vunits vs, vunits post_vs, 242 hunits width); 243 #ifdef WIDOW_CONTROL 244 void mark_last_line(); 245 #endif /* WIDOW_CONTROL */ 246 breakpoint *choose_breakpoint(); 247 void hyphenate_line(int start_here = 0); 248 void start_field(); 249 void wrap_up_field(); 250 void add_padding(); 251 node *make_tab_node(hunits d, node *next = 0); 252 node *get_prev_char(); 253 public: 254 int seen_space; 255 int seen_eol; 256 int suppress_next_eol; 257 int seen_break; 258 tab_stops tabs; 259 const symbol name; 260 unsigned char control_char; 261 unsigned char no_break_control_char; 262 charinfo *hyphen_indicator_char; 263 264 environment(symbol); 265 environment(const environment *); // for temporary environment 266 ~environment(); 267 statem *construct_state(int only_eol); 268 void copy(const environment *); 269 int is_dummy() { return dummy; } 270 int is_empty(); 271 int is_composite() { return composite; } 272 void set_composite() { composite = 1; } 273 vunits get_vertical_spacing(); // .v 274 vunits get_post_vertical_spacing(); // .pvs 275 int get_line_spacing(); // .L 276 vunits total_post_vertical_spacing(); 277 int get_point_size() { return size.to_scaled_points(); } 278 font_size get_font_size() { return size; } 279 int get_size() { return size.to_units(); } 280 int get_requested_point_size() { return requested_size; } 281 int get_char_height() { return char_height; } 282 int get_char_slant() { return char_slant; } 283 hunits get_digit_width(); 284 int get_font() { return fontno; }; // .f 285 font_family *get_family() { return family; } 286 int get_bold(); // .b 287 int get_adjust_mode(); // .j 288 int get_fill(); // .u 289 hunits get_indent(); // .i 290 hunits get_temporary_indent(); 291 hunits get_line_length(); // .l 292 hunits get_saved_line_length(); // .ll 293 hunits get_saved_indent(); // .in 294 hunits get_title_length(); 295 hunits get_prev_char_width(); // .w 296 hunits get_prev_char_skew(); 297 vunits get_prev_char_height(); 298 vunits get_prev_char_depth(); 299 hunits get_text_length(); // .k 300 hunits get_prev_text_length(); // .n 301 hunits get_space_width() { return env_space_width(this); } 302 int get_space_size() { return space_size; } // in ems/36 303 int get_sentence_space_size() { return sentence_space_size; } 304 hunits get_narrow_space_width() { return env_narrow_space_width(this); } 305 hunits get_half_narrow_space_width() 306 { return env_half_narrow_space_width(this); } 307 hunits get_input_line_position(); 308 const char *get_tabs(); 309 int get_line_tabs(); 310 int get_hyphenation_flags(); 311 int get_hyphen_line_max(); 312 int get_hyphen_line_count(); 313 hunits get_hyphenation_space(); 314 hunits get_hyphenation_margin(); 315 int get_center_lines(); 316 int get_right_justify_lines(); 317 int get_prev_line_interrupted() { return prev_line_interrupted; } 318 color *get_fill_color(); 319 color *get_glyph_color(); 320 color *get_prev_glyph_color(); 321 color *get_prev_fill_color(); 322 void set_glyph_color(color *c); 323 void set_fill_color(color *c); 324 node *make_char_node(charinfo *); 325 node *extract_output_line(); 326 void width_registers(); 327 void wrap_up_tab(); 328 void set_font(int); 329 void set_font(symbol); 330 void set_family(symbol); 331 void set_size(int); 332 void set_char_height(int); 333 void set_char_slant(int); 334 void set_input_line_position(hunits); // used by \n(hp 335 void interrupt(); 336 void spread() { spread_flag = 1; } 337 void possibly_break_line(int start_here = 0, int forced = 0); 338 void do_break(int spread = 0); // .br 339 void final_break(); 340 node *make_tag(const char *name, int i); 341 void newline(); 342 void handle_tab(int is_leader = 0); // do a tab or leader 343 void add_node(node *); 344 void add_char(charinfo *); 345 void add_hyphen_indicator(); 346 void add_italic_correction(); 347 void space(); 348 void space(hunits, hunits); 349 void space_newline(); 350 const char *get_glyph_color_string(); 351 const char *get_fill_color_string(); 352 const char *get_font_family_string(); 353 const char *get_font_name_string(); 354 const char *get_style_name_string(); 355 const char *get_name_string(); 356 const char *get_point_size_string(); 357 const char *get_requested_point_size_string(); 358 void output_pending_lines(); 359 void construct_format_state(node *n, int was_centered, int fill); 360 void construct_new_line_state(node *n); 361 void dump_troff_state(); 362 363 friend void title_length(); 364 friend void space_size(); 365 friend void fill(); 366 friend void no_fill(); 367 friend void adjust(); 368 friend void no_adjust(); 369 friend void center(); 370 friend void right_justify(); 371 friend void vertical_spacing(); 372 friend void post_vertical_spacing(); 373 friend void line_spacing(); 374 friend void line_length(); 375 friend void indent(); 376 friend void temporary_indent(); 377 friend void do_underline(int); 378 friend void do_input_trap(int); 379 friend void set_tabs(); 380 friend void margin_character(); 381 friend void no_number(); 382 friend void number_lines(); 383 friend void leader_character(); 384 friend void tab_character(); 385 friend void hyphenate_request(); 386 friend void no_hyphenate(); 387 friend void hyphen_line_max_request(); 388 friend void hyphenation_space_request(); 389 friend void hyphenation_margin_request(); 390 friend void line_width(); 391 #if 0 392 friend void tabs_save(); 393 friend void tabs_restore(); 394 #endif 395 friend void line_tabs_request(); 396 friend void title(); 397 #ifdef WIDOW_CONTROL 398 friend void widow_control_request(); 399 #endif /* WIDOW_CONTROL */ 400 401 friend void do_divert(int append, int boxing); 402 }; 403 404 extern environment *curenv; 405 extern void pop_env(); 406 extern void push_env(int); 407 408 void init_environments(); 409 void read_hyphen_file(const char *name); 410 411 extern double spread_limit; 412 413 extern int break_flag; 414 extern symbol default_family; 415 extern int translate_space_to_dummy; 416 417 extern unsigned char hpf_code_table[]; 418