diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/ltx2x/l2xacts.c |
Initial commit
Diffstat (limited to 'support/ltx2x/l2xacts.c')
-rw-r--r-- | support/ltx2x/l2xacts.c | 631 |
1 files changed, 631 insertions, 0 deletions
diff --git a/support/ltx2x/l2xacts.c b/support/ltx2x/l2xacts.c new file mode 100644 index 0000000000..5dd7687345 --- /dev/null +++ b/support/ltx2x/l2xacts.c @@ -0,0 +1,631 @@ +/* l2xacts.c Grammer actions for l2x */ +/* 6/96 replaced myprint(tag) by tag_print(tag) */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#ifndef STRTYPES_H +#include "strtypes.h" +#endif +#ifndef L2XCOM_H +#include "l2xcom.h" +#endif +#include "l2xusrlb.h" /* user defined action functions */ +#include "l2xlib.h" /* functions and global variables */ +#include "l2xytab.h" /* parser communication */ + + +/* functions defined herein */ +void default_start_with_opt(); +void default_end_start_opt(); +void start_it(); +void end_it(); +void start_section(); +void start_list(); +void end_list(); +void start_with_req(); +void action_p_p1(); +void action_last_p(); +void start_with_opt(); +void action_opt_first(); +void action_p_opt(); +void action_last_opt(); +void action_no_param(); +void do_start_pc(); +void do_end_pc(); +int not_ok_sym(); + + + /* 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 */ + + + |