/* lexer/parser communication */
extern int opt_param;
/* 6/96 changed int pos to PSENTRY pos */
/* DEFAULT_START_WITH_OPT default action before an initial opt param */
void default_start_with_opt(pos)
PSENTRY pos; /* ptr to sym entry */
{
if (not_ok_sym(pos)) {
return;
}
tag_print(get_opttag_t(pos)); /* print start tag for opt param */
set_print(get_opt_print(pos)); /* set parameter printing */
opt_param = TRUE; /* processing optional */
} /* end DEFAULT_START_WITH_OPT */
/* DEFAULT_END_START_OPT defaults action after an initial opt param */
void default_end_start_opt(pos)
PSENTRY pos; /* command position in table */
{
if (not_ok_sym(pos)) {
return;
}
opt_param = FALSE; /* not processing optional */
reset_print(); /* set printing on */
tag_print(get_opttag_et(pos)); /* print opt param end tag */
} /* end DEFAULT_END_START_OPT */
/* START_IT starts a grammar rule */
void start_it(pos) /* command position in table */
PSENTRY pos;
{
int ut;
if (not_ok_sym(pos)) {
return;
}
do_start_pc(pos); /* added 6/96 */
ut = get_user_type(pos);
switch (ut) { /* switch on user type */
case SECTIONING: {
start_section(pos);
break;
}
case BEGIN_LIST_ENV: {
start_list(pos);
break;
}
case END_LIST_ENV: {
end_list();
break;
}
}
tag_print(get_t(pos)); /* print command start tag */
} /* end START_IT */
/* END_IT ends a grammar rule */
void end_it(pos) /* position in command table */
PSENTRY pos;
{
int ut;
if (not_ok_sym(pos)) { /* out of range */
return;
}
ut = get_user_type(pos);
switch (ut) { /* switch on user type */
case SECTIONING: { /* end tag printed via start-section */
break;
}
default: {
tag_print(get_et(pos)); /* print command end tag */
break;
}
} /* end switch */
do_end_pc(pos); /* added 6/96 */
} /* end END_IT */
/* START_SECTION sets up sectioning stuff */
void start_section(pos) /* position in command table */
PSENTRY pos;
{
int this_level; /* sectioning level */
if (not_ok_sym(pos)) { /* out of range */
return;
}
this_level = get_level(pos);
close_doc_divs(this_level); /* close prior levels */
current_level = this_level; /* set current level */
set_clause_stack(current_level, get_et(pos) );
} /* end START_SECTION */
/* START_LIST sets up item list stuff */
void start_list(pos) /* position in command table */
PSENTRY pos;
{
if (not_ok_sym(pos)) { /* out of range */
return;
}
/* push tags onto list stack */
set_list_stack(get_item_t(pos), get_item_et(pos),
get_itemopt_t(pos), get_itemopt_et(pos) );
} /* end START_LIST */
/* END_LIST finishes a list environment */
void end_list()
{
if (list_level >= LIST_STACK_SIZE) {
yyerror("Somethings wrong (end_list): overflow");
list_level = LIST_STACK_SIZE - 1;
}
else if (list_level < 0) {
yyerror("Somethings wrong (end_list): underflow");
list_level = 0;
}
else if (num_items[list_level] > 0) { /* close off last item */
tag_print(list_str_stack[list_level]);
}
num_items[list_level] = 0;
list_level--;
} /* end END_LIST */
/* START_WITH_REQ action at start of command with req param */
void start_with_req(pos)
PSENTRY pos; /* command position in table */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
start_it(pos); /* command start action */
tag_print(get_tag_t(pos,1)); /* print start tag for 1st param */
set_print(get_param_print(pos,1)); /* set parameter printing */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_start_with_req(pos);
break;
}
default: { /* should not be here! */
warning("(start_with_req) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end START_WITH_REQ */
/* ACTION_P_P1 action between p'th and p+1'th req params */
void action_p_p1(pos,p)
PSENTRY pos; /* position of command in table */
int p; /* number of p'th parameter */
{
int p1;
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
p1 = p + 1;
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
reset_print(); /* set printing on */
tag_print(get_tag_et(pos,p)); /* print end tag for parameter p */
tag_print(get_tag_t(pos,p1)); /* print start tag for p+1 */
set_print(get_param_print(pos,p1)); /* set parameter printing */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_p_p1(pos,p);
break;
}
default: { /* should not be here! */
warning("(action_p_p1) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_P_P1 */
/* ACTION_LAST_P action after last req parameter */
void action_last_p(pos,p)
PSENTRY pos; /* position of command in table */
int p; /* number of last parameter */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
reset_print();
tag_print(get_tag_et(pos,p)); /* print end tag for parameter p */
end_it(pos); /* final action for command */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_last_p(pos,p);
break;
}
default: { /* should not be here! */
warning("(action_last_p) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_LAST_P */
/* START_WITH_OPT start action for command with optional param */
void start_with_opt(pos)
PSENTRY pos; /* position of command in table */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
start_it(pos); /* command start action */
default_start_with_opt(pos); /* start optional param */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_start_with_opt(pos);
break;
}
default: { /* should not be here! */
warning("(start_with_opt) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end START_WITH_OPT */
/* ACTION_OPT_FIRST action between opt and 1st param */
void action_opt_first(pos)
PSENTRY pos; /* position of command in table */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
default_end_start_opt(pos); /* end opt param */
tag_print(get_tag_t(pos,1)); /* print start tag for 1st param */
set_print(get_param_print(pos,1)); /* set parameter printing */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_opt_first(pos);
break;
}
default: { /* should not be here! */
warning("(action_opt_first) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_OPT_FIRST */
/* ACTION_P_OPT action between param p and opt */
void action_p_opt(pos,p)
PSENTRY pos; /* position of command in table */
int p; /* number of p'th parameter */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
reset_print(); /* set printing on */
tag_print(get_tag_et(pos,p)); /* print end tag for parameter p */
tag_print(get_opttag_t(pos)); /* print start tag for opt param */
set_print(get_opt_print(pos)); /* set parameter printing */
opt_param = TRUE; /* processing optional */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_p_opt(pos,p);
break;
}
default: { /* should not be here! */
warning("(action_p_opt) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_P_OPT */
/* ACTION_LAST_OPT action after last opt param */
void action_last_opt(pos)
PSENTRY pos; /* position of command in table */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
opt_param = FALSE; /* not processing optional */
reset_print();
tag_print(get_opttag_et(pos)); /* print end tag for opt parameter */
end_it(pos); /* final action for command */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_last_opt(pos);
break;
}
default: { /* should not be here! */
warning("(action_last_opt) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_LAST_OPT */
/* ACTION_NO_PARAM command with no params */
void action_no_param(pos)
PSENTRY pos; /* position of command in table */
{
int user_kind; /* user-specified command type */
if (not_ok_sym(pos)) {
return;
}
user_kind = get_user_type(pos);
switch(user_kind) {
case TEX_CHAR: /* the general, non-specials */
case CHAR_COMMAND:
case COMMAND:
case BEGIN_ENV:
case END_ENV:
case BEGIN_LIST_ENV:
case END_LIST_ENV:
case SECTIONING:
case BEGIN_DOCUMENT:
case END_DOCUMENT:
case VCOMMAND:
case BEGIN_VENV:
case END_VENV: {
start_it(pos); /* start action for command */
end_it(pos); /* final action for command */
break;
}
case SPECIAL: /* the specials */
case SPECIAL_BEGIN_ENV:
case SPECIAL_END_ENV:
case SPECIAL_BEGIN_LIST:
case SPECIAL_END_LIST:
case SPECIAL_COMMAND:
case SPECIAL_SECTIONING: {
special_action_no_param(pos);
break;
}
default: { /* should not be here! */
warning("(action_no_param) Unrecognized command type");
break;
}
} /* end switch on user_kind */
} /* end ACTION_NO_PARAM */
/* DO_START_PC sets the starting print control */
void do_start_pc(pos)
PSENTRY pos; /* position in command table */
{
int pc;
if (not_ok_sym(pos)) {
return;
}
pc = get_pc_enum(get_start_pc(pos));
switch (pc) {
case DEFAULT_PRINT : { /* do nothing */
break;
}
case RESET : { /* reset print control */
reset_print();
break;
}
default : { /* anything else changes the setting */
set_print(get_start_pc(pos));
break;
}
} /* end switch */
return;
} /* end DO_START_PC */
/* DO_END_PC sets the ending print control */
void do_end_pc(pos)
PSENTRY pos; /* position in command table */
{
int pc;
if (not_ok_sym(pos)) {
return;
}
pc = get_pc_enum(get_end_pc(pos));
switch (pc) {
case DEFAULT_PRINT : { /* do nothing */
break;
}
case RESET : { /* reset print control */
reset_print();
break;
}
default : { /* anything else changes the setting */
set_print(get_end_pc(pos));
break;
}
} /* end switch */
return;
} /* end DO_END_PC */
/* NOT_OK_SYM returns TRUE if sym entry not found */
int not_ok_sym(pos)
PSENTRY pos;
{
if (pos == NULL) {
yyerror("symbol table entry not found");
return(TRUE);
}
return(FALSE);
} /* end NOT_OK_SYM */