div.h revision 75584
1289848Sjkim// -*- C++ -*- 2289848Sjkim/* Copyright (C) 1989, 1990, 1991, 1992, 2001 Free Software Foundation, Inc. 3289848Sjkim Written by James Clark (jjc@jclark.com) 4289848Sjkim 5289848SjkimThis file is part of groff. 6289848Sjkim 7289848Sjkimgroff is free software; you can redistribute it and/or modify it under 8289848Sjkimthe terms of the GNU General Public License as published by the Free 9289848SjkimSoftware Foundation; either version 2, or (at your option) any later 10289848Sjkimversion. 11289848Sjkim 12289848Sjkimgroff is distributed in the hope that it will be useful, but WITHOUT ANY 13289848SjkimWARRANTY; without even the implied warranty of MERCHANTABILITY or 14289848SjkimFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15289848Sjkimfor more details. 16289848Sjkim 17289848SjkimYou should have received a copy of the GNU General Public License along 18289848Sjkimwith groff; see the file COPYING. If not, write to the Free Software 19289848SjkimFoundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20289848Sjkim 21289848Sjkimclass diversion { 22289848Sjkim friend void do_divert(int append, int boxing); 23289848Sjkim friend void end_diversions(); 24289848Sjkim diversion *prev; 25289848Sjkim node *saved_line; 26289848Sjkim hunits saved_width_total; 27289848Sjkim int saved_space_total; 28289848Sjkim hunits saved_saved_indent; 29289848Sjkim hunits saved_target_text_length; 30289848Sjkim int saved_prev_line_interrupted; 31289848Sjkimprotected: 32289848Sjkim symbol nm; 33289848Sjkim vunits vertical_position; 34289848Sjkim vunits high_water_mark; 35289848Sjkimpublic: 36289848Sjkim vunits marked_place; 37289848Sjkim diversion(symbol s = NULL_SYMBOL); 38289848Sjkim virtual ~diversion(); 39289848Sjkim virtual void output(node *nd, int retain_size, vunits vs, vunits post_vs, 40289848Sjkim hunits width) = 0; 41289848Sjkim virtual void transparent_output(unsigned char) = 0; 42289848Sjkim virtual void transparent_output(node *) = 0; 43289848Sjkim virtual void space(vunits distance, int forced = 0) = 0; 44289848Sjkim#ifdef COLUMN 45289848Sjkim virtual void vjustify(symbol) = 0; 46289848Sjkim#endif /* COLUMN */ 47289848Sjkim vunits get_vertical_position() { return vertical_position; } 48289848Sjkim vunits get_high_water_mark() { return high_water_mark; } 49289848Sjkim virtual vunits distance_to_next_trap() = 0; 50289848Sjkim void need(vunits); 51289848Sjkim const char *get_diversion_name() { return nm.contents(); } 52289848Sjkim virtual void set_diversion_trap(symbol, vunits) = 0; 53289848Sjkim virtual void clear_diversion_trap() = 0; 54289848Sjkim virtual void copy_file(const char *filename) = 0; 55289848Sjkim}; 56289848Sjkim 57289848Sjkimclass macro; 58289848Sjkim 59289848Sjkimclass macro_diversion : public diversion { 60289848Sjkim macro *mac; 61289848Sjkim hunits max_width; 62289848Sjkim symbol diversion_trap; 63289848Sjkim vunits diversion_trap_pos; 64289848Sjkimpublic: 65289848Sjkim macro_diversion(symbol, int); 66289848Sjkim ~macro_diversion(); 67289848Sjkim void output(node *nd, int retain_size, vunits vs, vunits post_vs, 68289848Sjkim hunits width); 69289848Sjkim void transparent_output(unsigned char); 70289848Sjkim void transparent_output(node *); 71289848Sjkim void space(vunits distance, int forced = 0); 72289848Sjkim#ifdef COLUMN 73289848Sjkim void vjustify(symbol); 74289848Sjkim#endif /* COLUMN */ 75289848Sjkim vunits distance_to_next_trap(); 76289848Sjkim void set_diversion_trap(symbol, vunits); 77289848Sjkim void clear_diversion_trap(); 78289848Sjkim void copy_file(const char *filename); 79289848Sjkim}; 80289848Sjkim 81289848Sjkimstruct trap { 82289848Sjkim trap *next; 83289848Sjkim vunits position; 84289848Sjkim symbol nm; 85289848Sjkim trap(symbol, vunits, trap *); 86289848Sjkim}; 87289848Sjkim 88289848Sjkimstruct output_file; 89289848Sjkim 90289848Sjkimclass top_level_diversion : public diversion { 91289848Sjkim int page_number; 92289848Sjkim int page_count; 93289848Sjkim int last_page_count; 94289848Sjkim vunits page_length; 95289848Sjkim hunits prev_page_offset; 96289848Sjkim hunits page_offset; 97289848Sjkim trap *page_trap_list; 98289848Sjkim trap *find_next_trap(vunits *); 99289848Sjkim int have_next_page_number; 100289848Sjkim int next_page_number; 101289848Sjkim int ejecting_page; // Is the current page being ejected? 102289848Sjkimpublic: 103289848Sjkim int before_first_page; 104289848Sjkim int no_space_mode; 105289848Sjkim top_level_diversion(); 106289848Sjkim void output(node *nd, int retain_size, vunits vs, vunits post_vs, 107289848Sjkim hunits width); 108289848Sjkim void transparent_output(unsigned char); 109289848Sjkim void transparent_output(node *); 110289848Sjkim void space(vunits distance, int forced = 0); 111289848Sjkim#ifdef COLUMN 112289848Sjkim void vjustify(symbol); 113289848Sjkim#endif /* COLUMN */ 114289848Sjkim hunits get_page_offset() { return page_offset; } 115289848Sjkim vunits get_page_length() { return page_length; } 116289848Sjkim vunits distance_to_next_trap(); 117289848Sjkim void add_trap(symbol nm, vunits pos); 118289848Sjkim void change_trap(symbol nm, vunits pos); 119289848Sjkim void remove_trap(symbol); 120289848Sjkim void remove_trap_at(vunits pos); 121289848Sjkim void print_traps(); 122289848Sjkim int get_page_count() { return page_count; } 123289848Sjkim int get_page_number() { return page_number; } 124289848Sjkim int get_next_page_number(); 125289848Sjkim void set_page_number(int n) { page_number = n; } 126289848Sjkim int begin_page(); 127289848Sjkim void set_next_page_number(int); 128289848Sjkim void set_page_length(vunits); 129289848Sjkim void copy_file(const char *filename); 130289848Sjkim int get_ejecting() { return ejecting_page; } 131289848Sjkim void set_ejecting() { ejecting_page = 1; } 132289848Sjkim friend void page_offset(); 133289848Sjkim void set_diversion_trap(symbol, vunits); 134289848Sjkim void clear_diversion_trap(); 135289848Sjkim void set_last_page() { last_page_count = page_count; } 136289848Sjkim}; 137289848Sjkim 138289848Sjkimextern top_level_diversion *topdiv; 139289848Sjkimextern diversion *curdiv; 140289848Sjkim 141289848Sjkimextern int exit_started; 142289848Sjkimextern int done_end_macro; 143289848Sjkimextern int last_page_number; 144289848Sjkimextern int seen_last_page_ejector; 145289848Sjkim 146289848Sjkimvoid spring_trap(symbol); // implemented by input.c 147289848Sjkimextern int trap_sprung_flag; 148289848Sjkimvoid postpone_traps(); 149289848Sjkimint unpostpone_traps(); 150289848Sjkim 151289848Sjkimvoid push_page_ejector(); 152289848Sjkimvoid continue_page_eject(); 153289848Sjkimvoid handle_first_page_transition(); 154289848Sjkimvoid blank_line(); 155289848Sjkim 156289848Sjkimextern void cleanup_and_exit(int); 157289848Sjkim