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