
/*
 *    Copyright 1986, 1987 Pat Joseph Monardo. All rights reserved.
 *    Copying of this file is granted according to the provisions 
 *    specified in the file COPYING which must accompany this file.
 */


/*
 *		eq.h
 */

#define	eq_level_field(EQ)		EQ.hh.hh2.b1
#define	eq_type_field(EQ)		EQ.hh.hh2.b0
#define	equiv_field(EQ)			EQ.hh.hh2.rh
#define	eq_level(EQ)			eq_level_field(eqtb[EQ])
#define	eq_type(EQ)				eq_type_field(eqtb[EQ])
#define	equiv(EQ)				equiv_field(eqtb[EQ])

#define	LEVEL_ZERO				MIN_QUARTERWORD
#define	LEVEL_ONE				(LEVEL_ZERO + 1)

#define	ACTIVE_BASE				1
#define	SINGLE_BASE	 			(ACTIVE_BASE + 128)
#define	NULL_CS					(SINGLE_BASE + 128)
#define	HASH_BASE				(NULL_CS + 1)
#define	FROZEN_CONTROL_SEQUENCE	(HASH_BASE + HASH_SIZE)
#define	FROZEN_PROTECTION		(FROZEN_CONTROL_SEQUENCE)
#define	FROZEN_CR				(FROZEN_CONTROL_SEQUENCE + 1)
#define	FROZEN_END_GROUP		(FROZEN_CONTROL_SEQUENCE + 2)
#define	FROZEN_RIGHT			(FROZEN_CONTROL_SEQUENCE + 3)
#define	FROZEN_FI				(FROZEN_CONTROL_SEQUENCE + 4)
#define	FROZEN_END_TEMPLATE		(FROZEN_CONTROL_SEQUENCE + 5)
#define	FROZEN_ENDV				(FROZEN_CONTROL_SEQUENCE + 6)
#define	FROZEN_RELAX			(FROZEN_CONTROL_SEQUENCE + 7)
#define	END_WRITE				(FROZEN_CONTROL_SEQUENCE + 8)
#define	FROZEN_DONT_EXPAND		(FROZEN_CONTROL_SEQUENCE + 9)
#define	FROZEN_NULL_FONT		(FROZEN_CONTROL_SEQUENCE + 10)
#define	FONT_ID_BASE			(FROZEN_NULL_FONT - FONT_BASE)

#define	UNDEFINED_CONTROL_SEQUENCE	(FROZEN_NULL_FONT + 257)

#define	GLUE_BASE				(UNDEFINED_CONTROL_SEQUENCE + 1)
#define	GLUE_PARS				18
#define	glue_par(G)				equiv(GLUE_BASE + G)

#define	LINE_SKIP_CODE					0
#define	BASELINE_SKIP_CODE				1
#define	PAR_SKIP_CODE					2
#define	ABOVE_DISPLAY_SKIP_CODE			3
#define	BELOW_DISPLAY_SKIP_CODE			4
#define	ABOVE_DISPLAY_SHORT_SKIP_CODE	5
#define	BELOW_DISPLAY_SHORT_SKIP_CODE	6
#define	LEFT_SKIP_CODE					7
#define	RIGHT_SKIP_CODE					8
#define	TOP_SKIP_CODE					9
#define	SPLIT_TOP_SKIP_CODE				10
#define	TAB_SKIP_CODE					11
#define	SPACE_SKIP_CODE					12
#define	XSPACE_SKIP_CODE				13
#define	PAR_FILL_SKIP_CODE				14
#define	THIN_MU_SKIP_CODE				15
#define	MED_MU_SKIP_CODE				16
#define	THICK_MU_SKIP_CODE				17

#define	line_skip					glue_par(LINE_SKIP_CODE)
#define	baseline_skip				glue_par(BASELINE_SKIP_CODE)
#define	par_skip					glue_par(PAR_SKIP_CODE)
#define	above_display_skip			glue_par(ABOVE_DISPLAY_SKIP_CODE)
#define	below_display_skip			glue_par(BELOW_DISPLAY_SKIP_CODE)
#define	above_display_short_skip	glue_par(ABOVE_DISPLAY_SHORT_SKIP_CODE)
#define	below_display_short_skip	glue_par(BELOW_DISPLAY_SHORT_SKIP_CODE)
#define	left_skip					glue_par(LEFT_SKIP_CODE)
#define	right_skip					glue_par(RIGHT_SKIP_CODE)
#define	top_skip					glue_par(TOP_SKIP_CODE)
#define	split_top_skip				glue_par(SPLIT_TOP_SKIP_CODE)
#define	tab_skip					glue_par(TAB_SKIP_CODE)
#define	space_skip					glue_par(SPACE_SKIP_CODE)
#define	xspace_skip					glue_par(XSPACE_SKIP_CODE)
#define	par_fill_skip				glue_par(PAR_FILL_SKIP_CODE)
#define	thin_mu_skip				glue_par(THIN_MU_SKIP_CODE)
#define	med_mu_skip					glue_par(MED_MU_SKIP_CODE)
#define	thick_mu_skip				glue_par(THICK_MU_USKIP_CODE)

#define	SKIP_BASE				(GLUE_BASE + GLUE_PARS)
#define	skip(S)					equiv(SKIP_BASE + S)

#define	MU_SKIP_BASE			(SKIP_BASE + 256)
#define	mu_skip(M)				equiv(MU_SKIP_BASE + M)

#define	LOCAL_BASE				(MU_SKIP_BASE + 256)

#define	PAR_SHAPE_LOC			LOCAL_BASE
#define	OUTPUT_ROUTINE_LOC		(LOCAL_BASE + 1)
#define	EVERY_PAR_LOC			(LOCAL_BASE + 2)
#define	EVERY_MATH_LOC			(LOCAL_BASE + 3)
#define	EVERY_DISPLAY_LOC		(LOCAL_BASE + 4)
#define	EVERY_HBOX_LOC			(LOCAL_BASE + 5)
#define	EVERY_VBOX_LOC			(LOCAL_BASE + 6)
#define	EVERY_JOB_LOC			(LOCAL_BASE + 7)
#define	EVERY_CR_LOC			(LOCAL_BASE + 8)
#define	ERR_HELP_LOC			(LOCAL_BASE + 9)

#define	TOKS_BASE				(LOCAL_BASE + 10)
#define	BOX_BASE				(TOKS_BASE + 256)
#define	CUR_FONT_LOC			(BOX_BASE + 256)
#define	MATH_FONT_BASE			(CUR_FONT_LOC + 1)
#define	CAT_CODE_BASE			(MATH_FONT_BASE + 48)
#define	LC_CODE_BASE			(CAT_CODE_BASE + 128)
#define	UC_CODE_BASE			(LC_CODE_BASE + 128)
#define	SF_CODE_BASE			(UC_CODE_BASE + 128)
#define	MATH_CODE_BASE			(SF_CODE_BASE + 128)

#define	par_shape_ptr			equiv(PAR_SHAPE_LOC)
#define	output_routine			equiv(OUTPUT_ROUTINE_LOC)
#define	every_par				equiv(EVERY_PAR_LOC)
#define	every_math				equiv(EVERY_MATH_LOC)
#define	every_display			equiv(EVERY_DISPLAY_LOC)
#define	every_hbox				equiv(EVERY_HBOX_LOC)
#define	every_vbox				equiv(EVERY_VBOX_LOC)
#define	every_job				equiv(EVERY_JOB_LOC)
#define	every_cr				equiv(EVERY_CR_LOC)
#define	err_help				equiv(ERR_HELP_LOC)
#define	toks(M)					equiv(TOKS_BASE + M)
#define	box(M)					equiv(BOX_BASE + M)
#define	cur_font				equiv(CUR_FONT_LOC)
#define	fam_fnt(M)				equiv(MATH_FONT_BASE + M)
#define	cat_code(M)				equiv(CAT_CODE_BASE + M)
#define	lc_code(M)				equiv(LC_CODE_BASE + M)
#define	uc_code(M)				equiv(UC_CODE_BASE + M)
#define	sf_code(M)				equiv(SF_CODE_BASE + M)
#define	math_code(M)			equiv(MATH_CODE_BASE + M)

#define	NULL_FONT				FONT_BASE
#define	VAR_CODE				070000

#define	INT_BASE				(MATH_CODE_BASE + 128)
#define	INT_PARS				50
#define	int_par(I)				eqtb[INT_BASE + I].i

#define	PRETOLERANCE_CODE			0
#define	TOLERANCE_CODE				1
#define	LINE_PENALTY_CODE			2
#define	HYPHEN_PENALTY_CODE			3		
#define	CLUB_PENALTY_CODE			4
#define	EX_HYPHEN_PENALTY_CODE		5
#define	WIDOW_PENALTY_CODE			6
#define	DISPLAY_WIDOW_PENALTY_CODE	7
#define	BROKEN_PENALTY_CODE			8
#define	BIN_OP_PENALTY_CODE			9
#define	REL_PENALTY_CODE			10
#define	PRE_DISPLAY_PENALTY_CODE	11
#define	POST_DISPLAY_PENALTY_CODE	12
#define	INTER_LINE_PENALTY_CODE		13
#define	DOUBLE_HYPHEN_DEMERITS_CODE	14
#define	FINAL_HYPHEN_DEMERITS_CODE	15
#define	ADJ_DEMERITS_CODE			16
#define	MAG_CODE					17
#define	DELIMITER_FACTOR_CODE		18
#define	LOOSENESS_CODE				19
#define	TIME_CODE					20
#define	DAY_CODE					21
#define	MONTH_CODE					22
#define	YEAR_CODE					23
#define	SHOW_BOX_BREADTH_CODE		24
#define	SHOW_BOX_DEPTH_CODE			25
#define	HBADNESS_CODE				26
#define	VBADNESS_CODE				27
#define	PAUSING_CODE				28
#define	TRACING_ONLINE_CODE			29
#define	TRACING_MACROS_CODE			30
#define	TRACING_STATS_CODE			31
#define	TRACING_PARAGRAPHS_CODE		32
#define	TRACING_PAGES_CODE			33
#define	TRACING_OUTPUT_CODE			34
#define	TRACING_LOST_CHARS_CODE		35
#define	TRACING_COMMANDS_CODE		36
#define	TRACING_RESTORES_CODE		37
#define	UC_HYPH_CODE				38
#define	OUTPUT_PENALTY_CODE			39
#define	MAX_DEAD_CYCLES_CODE		40
#define	HANG_AFTER_CODE				41
#define	FLOATING_PENALTY_CODE		42
#define	GLOBAL_DEFS_CODE			43
#define	CUR_FAM_CODE				44
#define	ESCAPE_CHAR_CODE			45
#define	DEFAULT_HYPHEN_CHAR_CODE	46
#define	DEFAULT_SKEW_CHAR_CODE		47
#define	END_LINE_CHAR_CODE			48
#define	NEW_LINE_CHAR_CODE			49

#define	pretolerance			int_par(PRETOLERANCE_CODE)
#define	tolerance				int_par(TOLERANCE_CODE)
#define	line_penalty			int_par(LINE_PENALTY_CODE)
#define	hyphen_penalty			int_par(HYPHEN_PENALTY_CODE)
#define	ex_hyphen_penalty		int_par(EX_HYPHEN_PENALTY_CODE)
#define	club_penalty			int_par(CLUB_PENALTY_CODE)
#define	widow_penalty			int_par(WIDOW_PENALTY_CODE)
#define	display_widow_penalty	int_par(DISPLAY_WIDOW_PENALTY_CODE)
#define	broken_penalty			int_par(BROKEN_PENALTY_CODE)
#define	bin_op_penalty			int_par(BIN_OP_PENALTY_CODE)
#define	rel_penalty				int_par(REL_PENALTY_CODE)
#define	pre_display_penalty		int_par(PRE_DISPLAY_PENALTY_CODE)
#define	post_display_penalty	int_par(POST_DISPLAY_PENALTY_CODE)
#define	inter_line_penalty		int_par(INTER_LINE_PENALTY_CODE)
#define	double_hyphen_demerits	int_par(DOUBLE_HYPHEN_DEMERITS_CODE)
#define	final_hyphen_demerits	int_par(FINAL_HYPHEN_DEMERITS_CODE)
#define	adj_demerits			int_par(ADJ_DEMERITS_CODE)
#define	mag						int_par(MAG_CODE)
#define	delimiter_factor		int_par(DELIMITER_FACTOR_CODE)
#define	looseness				int_par(LOOSENESS_CODE)
#define	time					int_par(TIME_CODE)
#define	day						int_par(DAY_CODE)
#define	month					int_par(MONTH_CODE)
#define	year					int_par(YEAR_CODE)
#define	show_box_breadth		int_par(SHOW_BOX_BREADTH_CODE)
#define	show_box_depth			int_par(SHOW_BOX_DEPTH_CODE)
#define	hbadness				int_par(HBADNESS_CODE)
#define	vbadness				int_par(VBADNESS_CODE)
#define	pausing					int_par(PAUSING_CODE)
#define	tracing_online			int_par(TRACING_ONLINE_CODE)
#define	tracing_macros			int_par(TRACING_MACROS_CODE)
#define	tracing_stats			int_par(TRACING_STATS_CODE)
#define	tracing_paragraphs		int_par(TRACING_PARAGRAPHS_CODE)
#define	tracing_pages			int_par(TRACING_PAGES_CODE)
#define	tracing_output			int_par(TRACING_OUTPUT_CODE)
#define	tracing_lost_chars		int_par(TRACING_LOST_CHARS_CODE)
#define	tracing_commands		int_par(TRACING_COMMANDS_CODE)
#define	tracing_restores		int_par(TRACING_RESTORES_CODE)
#define	uc_hyph					int_par(UC_HYPH_CODE)
#define	max_dead_cycles			int_par(MAX_DEAD_CYCLES_CODE)
#define	output_penalty			int_par(OUTPUT_PENALTY_CODE)
#define	hang_after				int_par(HANG_AFTER_CODE)
#define	floating_penalty		int_par(FLOATING_PENALTY_CODE)
#define	global_defs				int_par(GLOBAL_DEFS_CODE)
#define	cur_fam					int_par(CUR_FAM_CODE)
#define	escape_char				int_par(ESCAPE_CHAR_CODE)
#define	default_hyphen_char		int_par(DEFAULT_HYPHEN_CHAR_CODE)
#define	default_skew_char		int_par(DEFAULT_SKEW_CHAR_CODE)
#define	end_line_char			int_par(END_LINE_CHAR_CODE)
#define	new_line_char			int_par(NEW_LINE_CHAR_CODE)

#define	COUNT_BASE				(INT_BASE + INT_PARS)
#define	count(C)				eqtb[COUNT_BASE + C].i

#define	DEL_CODE_BASE			(COUNT_BASE + 256)
#define	del_code(D)				eqtb[DEL_CODE_BASE + D].i

#define	DIMEN_BASE				(DEL_CODE_BASE + 128)
#define	DIMEN_PARS				20
#define	dimen_par(D)			eqtb[DIMEN_BASE + D].sc

#define	PAR_INDENT_CODE				0
#define	MATH_SURROUND_CODE			1
#define	LINE_SKIP_LIMIT_CODE		2
#define	HSIZE_CODE					3
#define	VSIZE_CODE					4
#define	MAX_DEPTH_CODE				5
#define	SPLIT_MAX_DEPTH_CODE		6
#define	BOX_MAX_DEPTH_CODE			7
#define	HFUZZ_CODE					8
#define	VFUZZ_CODE					9
#define	DELIMITER_SHORTFALL_CODE	10
#define	NULL_DELIMITER_SPACE_CODE	11
#define	SCRIPT_SPACE_CODE			12
#define	PRE_DISPLAY_SIZE_CODE		13
#define	DISPLAY_WIDTH_CODE			14
#define	DISPLAY_INDENT_CODE			15
#define	OVERFULL_RULE_CODE			16
#define	HANG_INDENT_CODE			17
#define	H_OFFSET_CODE				18
#define	V_OFFSET_CODE				19

#define	par_indent				dimen_par(PAR_INDENT_CODE)
#define	math_surround			dimen_par(MATH_SURROUND_CODE)
#define	line_skip_limit			dimen_par(LINE_SKIP_LIMIT_CODE)
#define	hsize					dimen_par(HSIZE_CODE)
#define	vsize					dimen_par(VSIZE_CODE)
#define	max_depth				dimen_par(MAX_DEPTH_CODE)
#define	split_max_depth			dimen_par(SPLIT_MAX_DEPTH_CODE)
#define	box_max_depth			dimen_par(BOX_MAX_DEPTH_CODE)
#define	hfuzz					dimen_par(HFUZZ_CODE)
#define	vfuzz					dimen_par(VFUZZ_CODE)
#define	delimiter_shortfall		dimen_par(DELIMITER_SHORTFALL_CODE)
#define	null_delimiter_space	dimen_par(NULL_DELIMITER_SPACE_CODE)
#define	script_space			dimen_par(SCRIPT_SPACE_CODE)
#define	pre_display_size		dimen_par(PRE_DISPLAY_SIZE_CODE)
#define	display_width			dimen_par(DISPLAY_WIDTH_CODE)
#define	display_indent			dimen_par(DISPLAY_INDENT_CODE)
#define	overfull_rule			dimen_par(OVERFULL_RULE_CODE)
#define	hang_indent				dimen_par(HANG_INDENT_CODE)
#define	h_offset				dimen_par(H_OFFSET_CODE)
#define	v_offset				dimen_par(V_OFFSET_CODE)

#define	SCALED_BASE				(DIMEN_BASE + DIMEN_PARS)
#define	dimen(D)				eqtb[SCALED_BASE + D].sc

#define	EQTB_SIZE				(SCALED_BASE + 255)

global	mword		eqtb[];
global	qword		xeq_level[];

int		print_param();
int		print_length_param();
int		print_skip_param();
int		show_eqtb();
int		init_eq();
