-- TexNoadDefs.Mesa

-- definitions related to math Noads
-- last written by Doug Wyatt, December 13, 1979  4:37 PM

DIRECTORY
	TexDefs: FROM "TexDefs",
	TexMathDefs: FROM "TexMathDefs",
	TexNodeDefs: FROM "TexNodeDefs";

TexNoadDefs: DEFINITIONS =
BEGIN OPEN TexDefs,TexMathDefs;

NoadType: TYPE = {common,node,disc,style,space,listhead};

MField: TYPE = RECORD
	[SELECT tag: * FROM
		box => [box: TexNodeDefs.BoxNodePtr], -- pointer to a box Node or NIL
		mchar => [mchar: MChar], -- a math character
		mlist => [mlist: NoadPtr], -- pointer to the first noad of an mlist
		ENDCASE
	];
nilMField: MField=[box[NIL]];
MFieldPtr: TYPE = POINTER TO MField;
BoxMField: TYPE = box MField;
BoxMFieldPtr: TYPE = POINTER TO BoxMField;

Noad: TYPE = RECORD
	[
	link: NoadPtr,
	body: SELECT type: NoadType FROM
		common =>
			[
			mtype: MType, -- for spacing
			box: TexNodeDefs.BoxNodePtr, -- the resulting box
			cvariant: SELECT ctype: * FROM
				scripted =>
					[
					operand,subscr,supscr: MField,
					svariant: SELECT stype: SType FROM
						none,sqrt,over,under => NULL,
						vctr => [vctr: VctrType],
						op => [limitswitch: BOOLEAN],
						accent => [accent: MChar],
						ENDCASE
					],
				above =>
					[
					numerator,denominator: MField,
					aboverule: Dimn, ldelim,rdelim: Delimiter
					],
				delim => [dtype: DelimType, delim: Delimiter],
				ENDCASE
			],
		node => [p: TexNodeDefs.NodePtr],
		disc => [c: MChar], -- discretionary *
		style => [s: MathStyle],
		space => [sp: MathSpace],
		listhead => [last: NoadPtr],
		ENDCASE
	];


NoadPtr: TYPE = POINTER TO Noad;
CommonNoad: TYPE = common Noad;
CommonNoadPtr: TYPE = POINTER TO CommonNoad;
ScriptedNoad: TYPE = scripted CommonNoad;
ScriptedNoadPtr: TYPE = POINTER TO ScriptedNoad;
AboveNoad: TYPE = above CommonNoad;
AboveNoadPtr: TYPE = POINTER TO AboveNoad;

NoadListPtr: TYPE = POINTER TO listhead Noad;

InitNoadList: PROCEDURE RETURNS[NoadListPtr];
FinishNoadList: PROCEDURE[list: NoadListPtr] RETURNS[NoadPtr];
StoreNoad: PROCEDURE[list: NoadListPtr, p: NoadPtr];

MakeScriptedNoad: PROCEDURE[operand: MField←nilMField,
	mtype: MType←Ord, stype: SType←none]
	RETURNS[ScriptedNoadPtr];
MakeCharNoad: PROCEDURE[tmchar: TMChar] RETURNS[ScriptedNoadPtr];
MakeAccentNoad: PROCEDURE[accent: MChar] RETURNS[ScriptedNoadPtr];
MakeAboveNoad: PROCEDURE RETURNS[AboveNoadPtr];
MakeDelimNoad: PROCEDURE[dtype: DelimType, delim: Delimiter] RETURNS[NoadPtr];
MakeNodeNoad: PROCEDURE[TexNodeDefs.NodePtr] RETURNS[NoadPtr];
MakeDiscNoad: PROCEDURE[MChar] RETURNS[NoadPtr];
MakeStyleNoad: PROCEDURE[MathStyle] RETURNS[NoadPtr];
MakeSpaceNoad: PROCEDURE[MathSpace] RETURNS[NoadPtr];

StartNoadAllocation,FinishNoadAllocation: PROCEDURE;

TexNoad: PROGRAM;

END.