-- TexTableDefs.mesa

-- last written by Doug Wyatt, November 16, 1979  3:35 PM

DIRECTORY
	TexCmdDefs: FROM "TexCmdDefs" USING[Cmd],
	TexDefs: FROM "TexDefs"
		USING[Char,Font,Dimn,Penalty,HangSpec,Digit,
		 DefType,ChngType,IfType,BoxType,TopBotType,MarkType,CaseType,ModeType],
	TexGlueDefs: FROM "TexGlueDefs" USING[GluePtr,GlueType],
	TexHashDefs: FROM "TexHashDefs" USING[HashIndex],
	TexMathDefs: FROM "TexMathDefs"
		USING[MFont,MChar,TMChar,MathFontTableIndex,Delimiter,
		 MType,SType,StyleStyle,MathSpace,AboveType,VctrType,DelimType],
	TexTokenDefs: FROM "TexTokenDefs" USING[TokenListPtr];

TexTableDefs: DEFINITIONS =
BEGIN OPEN TexMathDefs,TexDefs;

TableError: SIGNAL;
UndefinedFont: ERROR;
SaveStackError: ERROR;

nlevs: CARDINAL = 32;
Lev: TYPE = [0..nlevs); -- nesting level; 0 means undefined

CurLev: PROCEDURE RETURNS[Lev];

EndingCode: TYPE = {bottomlevel, simpleblock, trueend, aligncode, alignentry,
	mathcode, outputend, noalignend, botinsend, topinsend, justend,
	mathblock, mathleft, endvcenter, endscanmath, falseend};

NewSaveLevel: PROCEDURE[EndingCode];
SaveCode: PROCEDURE RETURNS[EndingCode];
UnSave: PROCEDURE[EndingCode];

Cmd: TYPE = TexCmdDefs.Cmd;

CmdInfo: TYPE = RECORD[SELECT COMPUTED Cmd FROM
	macprm,lbrace,rbrace,mathbr,tabmrk,supmrk,submrk,
	 spacer,letter,otherchar,discr,accent,nonmathletter => [char: Char],
	mdiscr => [mchar: MChar],
	mathonly,tmcharentry => [tmchar: TMChar],
	fntfam => [mfont: MFont],
	call => [toklist: TexTokenDefs.TokenListPtr],
	assignglue => [glueparam: GlueParamType],
	assignreal => [dimnparam: DimnParamType],
	def => [deftype: DefType],
	chcode => [chngtype: ChngType],
	ifeven => [iftype: IfType],
	box => [boxtype: BoxType],
	hmove,vmove => [neg: BOOLEAN],
	vskip,hskip => [gluetype: TexGlueDefs.GlueType],
	leftright => [lr: DelimType],
	topbotins => [topbot: TopBotType],
	topbotmark => [marktype: MarkType],
	caseshift => [case: CaseType],
	mathinput => [mtype: MType, stype: SType],
	above => [abovetype: AboveType],
	mathstyle => [style: StyleStyle],
	mathspace => [space: MathSpace],
	vcenter => [vctr: VctrType],
	ifmode => [mode: ModeType],
	chartypeentry => [chartype: CharType],
	fontentry => [defined: BOOLEAN, font: Font],
	hangentry => [hangpar: HangPar],
	texparentry => [texpar: TexPar],
	glueentry => [glue: TexGlueDefs.GluePtr],
	undefined,ctrlseq,outpar,match,parend,endv,carret,xt,font,output,innput,
	 stop,ddt,ascii,setcount,advcount,count,ifT,elsecode,save,leaders,
	 halign,valign,noalign,vrule,hrule,mark,penlty,noindent,eject,
	 newaccent,eqno,exspace,limsw,italcorr,hangindent,unskip => NULL,
	ENDCASE];

HashIndex: TYPE = TexHashDefs.HashIndex;

HashEquiv: PROCEDURE[i: HashIndex] RETURNS[cmd: Cmd, info: CmdInfo];
SetHashEquiv: PROCEDURE[i: HashIndex, cmd: Cmd, info: CmdInfo,
	global: BOOLEAN←FALSE];
HashEquivDefined: PROCEDURE[i: HashIndex] RETURNS[BOOLEAN];


CharType: TYPE =
{
escape, -- escape delimiter (\ in TEX manual)
lbrace, -- begin block symbol ( { )
rbrace, -- end block symbol ( } )
mathbr, -- math break ( $ )
tabmrk, -- tab mark ( in alignment )
carret, -- carriage return and comment mark ( % )
macprm, -- macro parameter ( # )
supmrk, -- superscript ( ↑ )
submrk, -- subscript ( down arrow )
ignore, -- chars to ignore
spacer, -- chars treated as blank space
letter, -- chars treated as letters
otherchar -- none of the above character types
};

ChType: PROCEDURE[c: Char] RETURNS[CharType];
SetChType: PROCEDURE[c: Char, type: CharType];

MModeCode: PROCEDURE[c: Char] RETURNS[TMChar];
SetMModeCode: PROCEDURE[c: Char, tmchar: TMChar];

CurFont: PROCEDURE RETURNS[Font];
SetFont: PROCEDURE[f: Font];

CurMathFont: PROCEDURE[MathFontTableIndex] RETURNS[Font];
SetMathFont: PROCEDURE[MathFontTableIndex, Font];

HangParamType: TYPE = {begin, first, width};

HangPar: TYPE = RECORD[SELECT COMPUTED HangParamType FROM
	begin => [begin: CARDINAL],
	first => [first: BOOLEAN],
	width => [width: Dimn],
	ENDCASE];

CurHangIndent,GlobalHangIndent: PROCEDURE RETURNS[HangSpec];
SetHangIndent,SetGlobalHangIndent: PROCEDURE[HangSpec];

TexParamType: TYPE = {jpar, hpen, penpen, wpen, bpen, mbpen, mrpen, disppen,
	ragged, tracing};
PenaltyType: TYPE = TexParamType[jpar..disppen];

TexPar: TYPE = RECORD[SELECT COMPUTED TexParamType FROM
	jpar,hpen,penpen,wpen,bpen,mbpen,mrpen,disppen => [penalty: Penalty],
	ragged => [ragged: CARDINAL],
	tracing => [tracing: TraceInfo],
	ENDCASE];

TraceInfo: TYPE = RECORD
	[boxitems, boxlevel: [0..37B],
	showmacros,showinput,ddtstop: BOOLEAN,
	reportoverfull,showpages,ddtdump: BOOLEAN];

TexParam: PROCEDURE[t: TexParamType] RETURNS[TexPar];
SetTexParam: PROCEDURE[t: TexParamType, texpar: TexPar];

CurPenalty: PROCEDURE[t: PenaltyType] RETURNS[Penalty];
CurTracing: PROCEDURE RETURNS[TraceInfo];

GlueParamType: TYPE = {lineskip, baselineskip, parskip, dispskip,
	topskip, botskip, tabskip, dispaskip, dispbskip};

GlueParam: PROCEDURE[t: GlueParamType] RETURNS[TexGlueDefs.GluePtr];
SetGlueParam: PROCEDURE[t: GlueParamType, glue: TexGlueDefs.GluePtr];

DimnParamType: TYPE = {hsize, vsize, maxdepth, parindent,
	topbaseline, mathsurround, varunit, lineskiplimit};

DimnParam: PROCEDURE[t: DimnParamType] RETURNS[Dimn];
SetDimnParam: PROCEDURE[t: DimnParamType, d: Dimn];

Kount: PROCEDURE[Digit] RETURNS[INTEGER];
SetKount: PROCEDURE[Digit,INTEGER];

SpaceFactor: TYPE = Dimn; -- in thousandths
sfOne: SpaceFactor=1000; -- a space factor of one
SfTable: PROCEDURE[Char] RETURNS[SpaceFactor];
SetSfTable: PROCEDURE[Char,SpaceFactor];

AddDelimiter: PROCEDURE[c: Char, delim: Delimiter];
DelimLookup: PROCEDURE[Char] RETURNS[defined: BOOLEAN, delim: Delimiter];


TexHash: PRIVATE PROGRAM;
TexEqtb: PRIVATE PROGRAM;
TexHashInit: PRIVATE PROGRAM;
TexState: PRIVATE PROGRAM;
TexStateInit: PRIVATE PROGRAM;

TexTableControl: PROGRAM;

END.