freebsd-dev/contrib/groff/troff/div.h
1996-09-07 16:18:32 +00:00

151 lines
4.5 KiB
C++

// -*- 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. */
class diversion {
friend void do_divert(int append);
friend void end_diversions();
diversion *prev;
protected:
symbol nm;
vunits vertical_position;
vunits high_water_mark;
public:
vunits marked_place;
diversion(symbol s = NULL_SYMBOL);
virtual ~diversion();
virtual void output(node *nd, int retain_size, vunits vs, vunits post_vs,
hunits width) = 0;
virtual void transparent_output(unsigned char) = 0;
virtual void transparent_output(node *) = 0;
virtual void space(vunits distance, int forced = 0) = 0;
#ifdef COLUMN
virtual void vjustify(symbol) = 0;
#endif /* COLUMN */
vunits get_vertical_position() { return vertical_position; }
vunits get_high_water_mark() { return high_water_mark; }
virtual vunits distance_to_next_trap() = 0;
void need(vunits);
const char *get_diversion_name() { return nm.contents(); }
virtual void set_diversion_trap(symbol, vunits) = 0;
virtual void clear_diversion_trap() = 0;
virtual void copy_file(const char *filename) = 0;
};
class macro;
class macro_diversion : public diversion {
macro *mac;
hunits max_width;
symbol diversion_trap;
vunits diversion_trap_pos;
public:
macro_diversion(symbol, int);
~macro_diversion();
void output(node *nd, int retain_size, vunits vs, vunits post_vs,
hunits width);
void transparent_output(unsigned char);
void transparent_output(node *);
void space(vunits distance, int forced = 0);
#ifdef COLUMN
void vjustify(symbol);
#endif /* COLUMN */
vunits distance_to_next_trap();
void set_diversion_trap(symbol, vunits);
void clear_diversion_trap();
void copy_file(const char *filename);
};
struct trap {
trap *next;
vunits position;
symbol nm;
trap(symbol, vunits, trap *);
};
struct output_file;
class top_level_diversion : public diversion {
int page_number;
int page_count;
int last_page_count;
vunits page_length;
hunits prev_page_offset;
hunits page_offset;
trap *page_trap_list;
trap *find_next_trap(vunits *);
int have_next_page_number;
int next_page_number;
int ejecting_page; // Is the current page being ejected?
public:
int before_first_page;
int no_space_mode;
top_level_diversion();
void output(node *nd, int retain_size, vunits vs, vunits post_vs,
hunits width);
void transparent_output(unsigned char);
void transparent_output(node *);
void space(vunits distance, int forced = 0);
#ifdef COLUMN
void vjustify(symbol);
#endif /* COLUMN */
hunits get_page_offset() { return page_offset; }
vunits get_page_length() { return page_length; }
vunits distance_to_next_trap();
void add_trap(symbol nm, vunits pos);
void change_trap(symbol nm, vunits pos);
void remove_trap(symbol);
void remove_trap_at(vunits pos);
void print_traps();
int get_page_count() { return page_count; }
int get_page_number() { return page_number; }
int get_next_page_number();
void set_page_number(int n) { page_number = n; }
int begin_page();
void set_next_page_number(int);
void set_page_length(vunits);
void copy_file(const char *filename);
int get_ejecting() { return ejecting_page; }
void set_ejecting() { ejecting_page = 1; }
friend void page_offset();
void set_diversion_trap(symbol, vunits);
void clear_diversion_trap();
void set_last_page() { last_page_count = page_count; }
};
extern top_level_diversion *topdiv;
extern diversion *curdiv;
extern int exit_started;
extern int done_end_macro;
extern int last_page_number;
extern int seen_last_page_ejector;
void spring_trap(symbol); // implemented by input.c
extern int trap_sprung_flag;
void postpone_traps();
int unpostpone_traps();
void push_page_ejector();
void continue_page_eject();
void handle_first_page_transition();
void blank_line();
extern void cleanup_and_exit(int);