|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 13868 (0x362c)
Types: TextFile
Names: »box.h«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
└─⟦this⟧ »./DVIware/laser-setters/umd-dvi/h/box.h«
/*
* Copyright (c) 1987 University of Maryland Department of Computer Science.
* All rights reserved. Permission to copy for any purpose is hereby granted
* so long as this copyright notice remains intact.
*/
/* Box structures */
/* Magic constants. Note that these are stored into `scaled' types. */
#define RunningRule (-(1 << 30))
#define MFracDefaultThickness (1 << 31) /* => default rule thickness */
/* Magic penalty values */
#define InfPenalty 10000 /* infinity---no break at all */
#define EjectPenalty (-10000) /* negative infinity---forced break */
/* Ordinary list types */
#define CharNode 0 /* character; also math char */
#define HListNode 1 /* a horizontal list */
#define VListNode 2 /* a vertical list */
#define RuleNode 3 /* a rule */
#define InsertNode 4 /* an insertion */
#define MarkNode 5 /* a mark */
#define AdjustNode 6 /* a \vadjust */
#define LigatureNode 7 /* a ligature */
#define DiscretionaryNode 8 /* a discretionary break */
#define WhatsitNode 9 /* a "whatsit" */
#define BeginMathNode 10 /* a begin-math */
#define EndMathNode 11 /* an end-math */
#define GlueNode 12 /* link to glue */
#define KernNode 13 /* kerning */
#define PenaltyNode 14 /* penalty */
#define UnsetAlignNode 15 /* \halign or \valign that is incomplete */
/* Types arising only in math lists */
#define MathAtom 16 /* math atom */
#define MathStyle 17 /* math style change */
#define MathFraction 18 /* math fraction */
#define MathLeft 19 /* math left delimiter \left */
#define MathRight 20 /* math right delimiter \right */
#define MathChoice 21 /* math 4-way choice */
#define MathSubList 22 /* math list, possibly empty */
#define MathSubBox 23 /* math box (\hlist or \vlist) */
/* Kinds of math atoms */
enum MKind {
MKindOrd, MKindOp, MKindOpLimits, MKindOpNoLimits, MKindBin, MKindRel,
MKindOpen, MKindClose, MKindPunct, MKindInner, MKindOver, MKindUnder,
MKindAcc, MKindRad, MKindVCent
};
/* Math text styles */
#define MStyleCramped 1 /* added to others to get cramped style */
#define MStyleDisplay 0 /* display style */
#define MStyleText 2 /* text style */
#define MStyleScript 4 /* script style */
#define MStyleSScript 6 /* scriptscript style */
/*
* A font and character. Note that these limit the number of fonts and
* characters/font to 256.
*/
struct fontchar {
char fc_font; /* font index */
char fc_char; /* character index within the font */
};
/* a box */
struct box {
scaled bx_width; /* width of the box */
scaled bx_depth; /* depth of the box */
scaled bx_height; /* height of the box */
scaled bx_offset; /* offset (lower if h, right if v) */
struct node *bx_contents; /* contents of the box */
int bx_glueorder; /* -3=>minus hfilll; 3=>plus hfilll */
float bx_glueset; /* glue setting ratio */
};
/* a rule */
struct rule {
scaled ru_width; /* width of the rule */
scaled ru_depth; /* depth of the rule */
scaled ru_height; /* height of the rule */
};
/* an insert */
struct insert {
int ins_number; /* 0..254 (I hope) */
i32 ins_floatingpenalty; /* \floatingpenalty for this insert */
scaled ins_naturalheightplusdepth; /* what more can I say? */
scaled ins_splitmaxdepth; /* \splitmaxdepth for this insert */
struct node *ins_splittopskip; /* \splittopskip for this insert */
struct node *ins_contents; /* insertion contents */
};
/* a ligature */
struct ligature {
struct fontchar lig_fc; /* the ligature character */
struct node *lig_orig; /* the original set of characters */
};
/* a discretionary break */
struct discret {
struct node *disc_prebrk; /* characters to precede break */
struct node *disc_postbrk; /* characters to follow break */
int disc_replaces; /* replaces this many nodes */
};
/* a whatsit */
struct whatsit {
int wh_type; /* type of whatsit */
char *wh_other; /* other stuff */
};
/*
* A glue specification. There may be multiple pointers to this glue spec,
* so we have a reference count attached.
*/
struct gluespec {
int gl_refcount; /* # pointers to here */
scaled gl_width; /* normal width */
scaled gl_stretch; /* strechability */
scaled gl_shrink; /* shrinkability */
short gl_stretchorder; /* 0..3 for <>, fil, fill, filll */
short gl_shrinkorder; /* same */
};
/* a link-to-glue node */
#define GlueIsNormal 0 /* ordinary glue */
#define GlueIsSkip 1 /* \hskip or \vskip */
#define GlueIsNonScript 2 /* \nonscript */
#define GlueIsMuGlue 3 /* mu glue */
#define GlueIsALeaders 4 /* aligned leaders */
#define GlueIsCLeaders 5 /* centered leaders */
#define GlueIsXLeaders 6 /* expanded leaders */
struct gluenode {
int gn_type; /* special glue types */
struct node *gn_glue; /* the glue itself */
struct BoundName *gn_skip; /* skip parameter that generated it */
struct box *gn_leaderbox; /* leader box if leaders */
};
/* a kern */
#define ImplicitKern 0 /* kerning for things like "AV" */
#define ExplicitKern 1 /* \kern or italic correction */
#define MKern 2 /* \mkern */
struct kern {
int kern_type; /* type of kern */
scaled kern_width; /* width of kern */
};
/*
* An unset (incomplete) alignment (\halign or \valign).
* This looks to be the largest node type, so I am using 'char' and 'short'
* to try to keep it small...
*/
struct unsetalign {
scaled unset_width; /* width of the unset box */
scaled unset_depth; /* depth of the unset box */
scaled unset_height; /* height of the unset box */
struct node *unset_contents; /* contents of the unset box */
scaled unset_glueshrink; /* total glue shrink */
scaled unset_gluestretch; /* total glue stretch */
char unset_shrinkorder; /* glue shrink order */
char unset_stretchorder; /* glue stretch order */
short unset_spancount; /* the number of spanned columns */
};
/* a token list */
struct toklist {
int tok_refcount; /* the number of references */
struct node *tok_list; /* the tokens or the macro def'n */
};
/* Math delimiter */
struct delim {
char smallfam; /* family number for small char */
char smallchar; /* character in small family */
char largefam; /* family number for large char */
char largechar; /* character in large family */
};
/* Math atoms, radicals, \left s, \right s, accents */
struct matom {
enum MKind kind; /* atom kind (if not \left, \right) */
struct node *nucleus; /* nucleus */
struct node *supscr; /* superscript (optional) */
struct node *subscr; /* subscript (optional) */
struct delim delimiter; /* delimiter(s) (optional) */
/* accents are stored in the small delim */
};
/* Math fraction */
struct mfrac {
struct node *numerator; /* numerator */
struct node *denominator; /* denominator */
scaled thickness; /* dividing rule thickness */
struct delim leftdelim; /* left delimiter (optional) */
struct delim rightdelim; /* right delimiter (optional) */
};
/* Math choice */
struct mchoice {
struct node *ifdisplay;
struct node *iftext;
struct node *ifscript;
struct node *ifsscript;
};
/*
* This structure exists mainly for `sizeof'. Character nodes are by far the
* most common nodes, so to save memory space, nodes of type CharNode are kept
* in a separate free list and do not get a full size node. This means that
* node lists must be handled carefully, but that is already necessary, so it
* is no loss.
*/
struct charnode {
struct node *next;
short type;
struct fontchar fc;
};
/*
* A node in a list. Note that the first part of this structure is shared
* with the struct charnode.
*/
struct node {
struct node *next; /* next in linked list */
short type; /* type of this node */
struct fontchar fc; /* value iff char */
union {
struct box un_box; /* value iff box */
struct rule un_rule; /* value iff rule */
struct insert un_ins; /* value iff insert */
struct toklist *un_mark; /* value iff mark */
struct ligature un_lig; /* value iff ligature */
struct discret un_disc; /* value iff discret. brk */
struct whatsit un_whatsit; /* value iff whatsit */
struct gluespec un_gluespec; /* value iff glue */
struct gluenode un_gluenode; /* value iff link to glue */
struct kern un_kern; /* value iff kern */
i32 un_integer; /* value if integer */
struct unsetalign un_unset; /* value iff unset alignment */
struct matom un_matom; /* value if math atom */
struct mfrac un_mfrac; /* value iff math fraction */
struct mchoice un_mchoice; /* value iff math choice */
struct node *un_node; /* value if node list */
} node_un;
};
/* Shorthand */
#define FC fc
#define Font fc.fc_font
#define Char fc.fc_char
#define BoxWidth node_un.un_box.bx_width
#define BoxDepth node_un.un_box.bx_depth
#define BoxHeight node_un.un_box.bx_height
#define BoxOffset node_un.un_box.bx_offset
#define BoxContents node_un.un_box.bx_contents
#define BoxGlueOrder node_un.un_box.bx_glueorder
#define BoxGlueSet node_un.un_box.bx_glueset
#define RuleWidth node_un.un_rule.ru_width
#define RuleDepth node_un.un_rule.ru_depth
#define RuleHeight node_un.un_rule.ru_height
#define InsertNumber node_un.un_ins.ins_number
#define InsertFloatingPenalty node_un.un_ins.ins_floatingpenalty
#define InsertNaturalHeightPlusDepth node_un.un_ins.ins_naturalheightplusdepth
#define InsertSplitMaxDepth node_un.un_ins.ins_splitmaxdepth
#define InsertSplitTopSkip node_un.un_ins.ins_splittopskip
#define InsertContents node_un.un_ins.ins_contents
#define Mark node_un.un_mark
#define LigatureFC node_un.un_lig.lig_fc
#define LigatureOrig node_un.un_lig.lig_orig
#define DiscretPreBreak node_un.un_disc.disc_prebrk
#define DiscretPostBreak node_un.un_disc.disc_postbrk
#define DiscretReplaces node_un.un_disc.disc_replaces
#define WhatsitType node_un.un_whatsit.wh_type
#define WhatsitOther node_un.un_whatsit.wh_other
#define GlueRefCount node_un.un_gluespec.gl_refcount
#define GlueWidth node_un.un_gluespec.gl_width
#define GlueStretch node_un.un_gluespec.gl_stretch
#define GlueShrink node_un.un_gluespec.gl_shrink
#define GlueStretchOrder node_un.un_gluespec.gl_stretchorder
#define GlueShrinkOrder node_un.un_gluespec.gl_shrinkorder
#define Glue node_un.un_gluenode.gn_glue
#define GlueSkip node_un.un_gluenode.gn_skip
#define GlueType node_un.un_gluenode.gn_type
#define GlueLeaderBox node_un.un_gluenode.gn_leaderbox
#define KernWidth node_un.un_kern.kern_width
#define KernType node_un.un_kern.kern_type
#define Penalty node_un.un_integer
#define UnsetWidth node_un.un_unset.unset_width
#define UnsetDepth node_un.un_unset.unset_depth
#define UnsetHeight node_un.un_unset.unset_height
#define UnsetContents node_un.un_unset.unset_contents
#define UnsetGlueShrink node_un.un_unset.unset_glueshrink
#define UnsetGlueStretch node_un.un_unset.unset_gluestretch
#define UnsetShrinkOrder node_un.un_unset.unset_shrinkorder
#define UnsetStretchOrder node_un.un_unset.unset_stretchorder
#define UnsetSpanCount node_un.un_unset.unset_spancount
#define MAtomKind node_un.un_matom.kind
#define MAtomNucleus node_un.un_matom.nucleus
#define MAtomSupscr node_un.un_matom.supscr
#define MAtomSubscr node_un.un_matom.subscr
#define MAtomDelimiter node_un.un_matom.delimiter
#define MAtomAccFam node_un.un_matom.delimiter.smallfam
#define MAtomAccChar node_un.un_matom.delimiter.smallchar
#define MFracNumerator node_un.un_mfrac.numerator
#define MFracDenominator node_un.un_mfrac.denominator
#define MFracThickness node_un.un_mfrac.thickness
#define MFracLeftDelim node_un.un_mfrac.leftdelim
#define MFracRightDelim node_un.un_mfrac.rightdelim
#define MChoiceDisplay node_un.un_mchoice.ifdisplay
#define MChoiceText node_un.un_mchoice.iftext
#define MChoiceScript node_un.un_mchoice.ifscript
#define MChoiceSScript node_un.un_mchoice.ifsscript
#define MStyle node_un.un_integer
#define MSub node_un.un_node
struct node *FreeNodes;
struct node *FreeChars;
struct node *MoreNodes();
struct node *MoreChars();
/*
* These macros quickly allocate and dispose of nodes. Watch out; the
* arguments to NewNode and NewCharNode should be pointers that are to
* be filled in. Moreover, the argument is accessed twice, so beware
* side effects!
*/
#define NewNode(n) \
if (((n) = FreeNodes) == NULL) \
(n) = MoreNodes(); \
else \
FreeNodes = (n)->next
#define NewCharNode(n) \
if (((n) = FreeChars) == NULL) \
(n) = MoreChars(); \
else \
FreeChars = (n)->next
#define FreeNode(n) ((n)->next = FreeNodes, FreeNodes = (n))
#define FreeChar(n) ((n)->next = FreeChars, FreeChars = (n))
/* To free either a CharNode or a Node, use FreeEither! */
#define FreeEither(n) ((n)->type ? FreeNode(n) : FreeChar(n))
#define DelTokRef(p) (--(p)->tok_refcount < 0 ? FlushList(p) : NULL)
#define DelGlueRef(p) (--(p)->GlueRefCount < 0 ? FreeNode(p) : NULL)
/* These determine the granularity of node allocation */
#define NodeAllocSize 300 /* Nodes per MoreNodes() */
#define CharAllocSize 2500 /* CharNodes per MoreChars() */
struct node *CopyGlueSpec();
struct node *LinkToSkipParam();
struct node *LinkToGlueSpec();
struct node *LinkToCopyOfSkipParam();
#define NodeListDisplay(p) (s_addc('.'), ShowNodeList(p), s_delc())
/*
* The ordering of the types is important here, because it allows simple
* decisions for common operations.
*/
#define CanBreakAtGlue(n) ((n)->type < BeginMathNode)
#define CanDiscardAfterBreak(n) ((n)->type >= BeginMathNode)
struct node ZeroGlue; /* the zero-amount glue (0pt) */
struct node FilGlue; /* 0pt plus1fil minus0pt */
struct node FillGlue; /* 0pt plus1fill minus0pt */
struct node SSGlue; /* 0pt plus1fil minus1fil */
struct node FilNegGlue; /* 0pt plus-1fil minus0pt */
i32 ShowBoxMaxDepth; /* max nesting depth in box displays */
i32 ShowBoxMaxBreadth; /* max number of items per list level */
int FontInShortDisplay; /* the "current font" during a ShortDisplay */