-- TexNodeDefs.Mesa
-- definitions related to Nodes
-- last written by Doug Wyatt, December 19, 1979 12:33 AM
DIRECTORY
TexDefs: FROM "TexDefs",
TexGlueDefs: FROM "TexGlueDefs",
TexTokenDefs: FROM "TexTokenDefs";
TexNodeDefs: DEFINITIONS =
BEGIN OPEN TexGlueDefs,TexDefs;
NodeType: TYPE = {char, string, box, rule, glue, space, kern, leader, hyph,
penalty, disc, eject, mark, ins, unset, listhead};
StringLength: TYPE = [0..32);
maxstringlength: CARDINAL = LAST[StringLength];
HyphControl: TYPE = {on,off};
Node: TYPE = RECORD
[
link: NodePtr,
body: SELECT type: NodeType FROM
char,disc => [c: FChar],
string => [font: Font, length: StringLength,
text: PACKED ARRAY [0..0) OF Char],
box =>
[
dir: Direction, -- which direction (v or h)
altered: BOOLEAN, -- if TRUE, box dimensions have been altered
encloses: BOOLEAN, -- if TRUE, this box encloses its contents' bbox
head: NodePtr,
width, depth, height, shiftamt: Dimn,
glueset: GlueSet
],
rule => [width, depth, height: Dimn],
glue => [g: GluePtr],
space, kern => [s: Dimn], -- glue with no stretch or shrink
-- kern nodes usually have s<0. The line-breaking and justification
-- machinery must be able to distinguish between kerns and spaces
leader => [p: NodePtr],
hyph => [auto: HyphControl],
penalty => [pts: Penalty],
eject => NULL,
mark => [t: TexTokenDefs.TokenListPtr],
ins =>
[
where: TopBotType,
dir: Direction,
vlist: NodePtr,
glue: GluePtr
],
unset =>
[
box: BoxNodePtr, -- points to box Node
totalStretch: FlexSums
],
listhead => [last: NodePtr], -- points to last node in list
ENDCASE
];
NodePtr: TYPE = POINTER TO Node;
CharNodePtr: TYPE = POINTER TO char Node;
StringNodePtr: TYPE = POINTER TO string Node;
RuleNodePtr: TYPE = POINTER TO rule Node;
BoxNodePtr: TYPE = POINTER TO box Node;
GlueNodePtr: TYPE = POINTER TO glue Node;
InsNodePtr: TYPE = POINTER TO ins Node;
UnsetNodePtr: TYPE = POINTER TO unset Node;
NodeListPtr: TYPE = POINTER TO listhead Node;
-- given list: NodeListPtr,
-- list.link points to the first node in the list
-- list.last points to the last node in the list
-- if the list is empty, list.link=NIL and list.last=list
-- if the list has one node, list.link=list.last
-- list.last.link=NIL at all times
-- to append a node [pointed to by p] to the list, do:
-- list.last.link←p; list.last←p; [p.link←NIL;]
InitNodeList: PROCEDURE RETURNS[NodeListPtr];
MakeNodeList: PROCEDURE[p: NodePtr] RETURNS[NodeListPtr];
FinishNodeList: PROCEDURE[NodeListPtr] RETURNS[NodePtr];
StoreNode: PROCEDURE[list: NodeListPtr, p: NodePtr];
-- = INLINE BEGIN list.last.link←p; list.last←p END;
InsertNode: PROCEDURE[list: NodeListPtr, p: NodePtr];
RemoveNode: PROCEDURE[list: NodeListPtr] RETURNS[NodePtr];
InsertNodeList: PROCEDURE[list, inslist: NodeListPtr];
-- inserts inslist at the front of list; destroys inslist's list head
AppendNodeList: PROCEDURE[list, applist: NodeListPtr];
-- appends applist at the back of list; destroys applist's list head
RemoveNodeList: PROCEDURE[list: NodeListPtr, p: NodePtr]
RETURNS[NodeListPtr];
-- removes nodes up to and including p from the front of list;
-- makes and returns a new list
FreeNodeList: PROCEDURE[list: NodeListPtr] = INLINE
BEGIN DsNodeList[FinishNodeList[list]] END;
stringNodeSize: PRIVATE CARDINAL = SIZE[string Node];
StringNodeSize: PROCEDURE[length: CARDINAL] RETURNS[CARDINAL]
= INLINE BEGIN RETURN[stringNodeSize+(length+1)/2] END;
DsNode: PROCEDURE[NodePtr]; -- free a node and anything it points to
DsNodeList: PROCEDURE[NodePtr]; -- free a list of nodes
MakeBoxNode: PROCEDURE[dir: Direction, head: NodePtr, h,d,w: Dimn]
RETURNS[BoxNodePtr];
NullBox: PROCEDURE RETURNS[BoxNodePtr];
MakeCharNode: PROCEDURE[FChar] RETURNS[CharNodePtr];
MakeStringNode: PROCEDURE[Font,STRING] RETURNS[StringNodePtr];
MakeDiscNode: PROCEDURE[FChar] RETURNS[NodePtr];
MakeEjectNode: PROCEDURE RETURNS[NodePtr];
MakeGlueNode: PROCEDURE[GluePtr] RETURNS[GlueNodePtr];
MakeHyphNode: PROCEDURE[HyphControl] RETURNS[NodePtr];
MakeInsNode: PROCEDURE[tb: TopBotType, dir: Direction,
hd: NodePtr, g: GluePtr] RETURNS[InsNodePtr];
MakeUnsetNode: PROCEDURE[box: BoxNodePtr,fPtr: FlexSumsPtr]
RETURNS[UnsetNodePtr];
MakeKernNode: PROCEDURE[Dimn] RETURNS[NodePtr];
MakeLeaderNode: PROCEDURE[NodePtr] RETURNS[NodePtr];
MakeMarkNode: PROCEDURE[TexTokenDefs.TokenListPtr] RETURNS[NodePtr];
MakePenaltyNode: PROCEDURE[Penalty] RETURNS[NodePtr];
MakeRuleNode: PROCEDURE[width,height,depth: Dimn] RETURNS[RuleNodePtr];
MakeSpace: PROCEDURE[Dimn] RETURNS[NodePtr];
TexNode: PROGRAM;
END.