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 *);