|  | enum slugtypes { | 
|  | NONE,		// can't happen | 
|  | VBOX,		// Vertical Box -- printable stuff | 
|  | SP,		// paddable SPace | 
|  | BS,		// start Breakable Stream | 
|  | US,		// start Unbreakable Stream | 
|  | BF,		// start Breakable Float | 
|  | UF,		// start Unbreakable Float | 
|  | PT,		// start Page Top material (header) | 
|  | BT,		// start page BoTtom material (footer) | 
|  | END,		// ENDs of groups | 
|  | NEUTRAL,	// NEUTRALized slugs can do no harm (cf. CIA) | 
|  | PAGE,		// beginning of PAGE in troff input | 
|  | TM,		// Terminal Message to appear during output | 
|  | COORD,		// output page COORDinates | 
|  | NE,		// NEed command | 
|  | MC,		// Multiple-Column command | 
|  | CMD,		// misc CoMmanDs:  FC, FL, BP | 
|  | PARM,		// misc PARaMeters:  NP, FO | 
|  | LASTTYPE	// can't happen either | 
|  | }; | 
|  |  | 
|  | enum cmdtypes { | 
|  | FC,	// Freeze 2-Column material | 
|  | FL,	// FLush all floats before reading more stream | 
|  | BP	// Break Page | 
|  | }; | 
|  |  | 
|  | enum parmtypes { | 
|  | NP,	// distance of top margin from page top (New Page) | 
|  | FO,	// distance of bottom margin from page top (FOoter) | 
|  | PL,	// distance of physical page bottom from page top (Page Length) | 
|  | MF,	// minimum fullness required for padding | 
|  | CT,	// tolerance for division into two columns | 
|  | WARN,	// warnings to stderr? | 
|  | DBG	// debugging flag | 
|  | }; | 
|  |  | 
|  | class slug { | 
|  | int	serialnum; | 
|  | int	dp;		// offset of data for this slug in inbuf | 
|  | int	linenum;	// input line number (approx) for this slug | 
|  | short	font;		// font in effect at slug beginning | 
|  | short	size;		// size in effect at slug beginning | 
|  | short	seen;		// 0 until output | 
|  | short	ncol;		// number of columns (1 or 2) | 
|  | short	offset;		// horizontal offset for 2 columns | 
|  | public: | 
|  | short	type;		// VBOX, PP, etc. | 
|  | short	parm;		// parameter | 
|  | short	base;		// "depth" of this slug (from n command) | 
|  | int	hpos;		// abs horizontal position | 
|  | int	dv;		// height of this slug above its input Vpos | 
|  | union { | 
|  | int	ht;	// "height" of this slug (from n command) | 
|  | int	parm2;	// second parameter, since only VBOXes have ht | 
|  | }; | 
|  | friend	slug getslug(FILE *); | 
|  | friend	void checkout(); | 
|  | friend	slug eofslug(); | 
|  | void	coalesce();	// with next slug in array slugs[] | 
|  | void	neutralize();	// render this one a no-op | 
|  | void	dump();		// dump its contents for debugging | 
|  | char	*headstr();	// string value of text | 
|  | void	slugout(int);	// add the slug to the output | 
|  | char	*typename();	// printable slug type | 
|  | int	serialno()	{ return serialnum; } | 
|  | int	numcol()	{ return ncol; } | 
|  | int	lineno()	{ return linenum; } | 
|  | }; | 
|  |  | 
|  | // functions in slug.c | 
|  | slug	eofslug(); | 
|  | slug	getslug(FILE *); |