summaryrefslogtreecommitdiff
path: root/support/ltx2x/l2xusrlb.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/ltx2x/l2xusrlb.c
Initial commit
Diffstat (limited to 'support/ltx2x/l2xusrlb.c')
-rw-r--r--support/ltx2x/l2xusrlb.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/support/ltx2x/l2xusrlb.c b/support/ltx2x/l2xusrlb.c
new file mode 100644
index 0000000000..c4d2b98bc3
--- /dev/null
+++ b/support/ltx2x/l2xusrlb.c
@@ -0,0 +1,290 @@
+/* l2xusrlb.c user-defined support functions for l2x actions */
+/* Written by Peter Wilson (Catholic University and NIST) */
+
+/* Development of this software was funded by the United States Government,
+ * and is not subject to copyright.
+ */
+
+
+#include <stdio.h>
+#ifndef STRTYPES_H
+#include "strtypes.h"
+#endif
+#ifndef L2XCOM_H
+#include "l2xcom.h"
+#endif
+#include "l2xytab.h" /* parser communication */
+#include "l2xlib.h" /* l2x system library functions */
+#include "l2xacts.h" /* l2x standard actions */
+
+/* lexer/parser communication */
+extern int opt_param;
+
+/* In general, actions are specified via case statements
+ * in the special_ functions at the end of this file. The
+ * special actions must be provided by the extender.
+ */
+
+/* The system special_ functions */
+void special_start_with_req();
+void special_action_p_p1();
+void special_action_last_p();
+void special_start_with_opt();
+void special_action_opt_first();
+void special_action_p_opt();
+void special_action_last_opt();
+void special_action_no_param();
+
+/* extender-provided functions */
+void prwboiler1();
+void prwboiler2();
+void prwboiler3();
+void codespecial_start();
+void codespecial_p1();
+void codespecial_end();
+
+
+
+ /* FUNCTIONS, ETC. TO BE PROVIDED BY THE EXTENDER */
+
+ /* demonstration string definition */
+STRING boiler_string_3 = "\nin the middle of it.\n\n";
+
+ /* demonstration functions */
+
+char codebuf[80]; /* a string buffer */
+
+/* PRWBOILER1 print some demonstration boilerplate */
+void prwboiler1()
+{
+ myprint("\nSome boilerplate text with ");
+} /* end PRWBOILER1 */
+
+/* PRWBOILER2 print some demonstration boilerplate */
+void prwboiler2()
+{
+ myprint("\nin the middle. Now there is\n");
+ myprint("some more boilerplate with ");
+} /* end PRWBOILER2 */
+
+/* PRWBOILER3 yet more demonstration boilerplate */
+void prwboiler3()
+{
+ myprint(boiler_string_3);
+} /* end PRWBOILER1 */
+
+/* CODESPECIAL_START actions for start of CODEspecial command */
+void codespecial_start(pos)
+PSENTRY pos; /* symbol entry */
+{
+ start_section(pos); /* do start of sectioning */
+ tag_print(get_t(pos)); /* print start tag */
+} /* end CODESPECIAL_START */
+
+
+/* CODESPECIAL_P1 actions at stast of CODEspecial param 1 */
+void codespecial_p1(pos)
+PSENTRY pos; /* symbol entry */
+{
+ tag_print(get_tag_t(pos,1)); /* print 1st param start tag */
+ initialise_sysbuf(); /* clear system string buffer */
+ set_print(p_print_to_sysbuf); /* put param text into system buffer */
+} /* end CODESPECIAL_P1 */
+
+/* CODESPECIAL_END actions at end of CODEspecial command */
+void codespecial_end(pos)
+PSENTRY pos; /* symbol entry */
+{
+ initialise_string(codebuf); /* clear this string buffer */
+ copy_sysbuf(codebuf); /* copy system buffer into this buffer */
+ reset_print(); /* normal printing */
+ prwboiler1(); /* print some boilerplate */
+ print_sysbuf(); /* print system buffer */
+ prwboiler2(); /* print more boilerplate */
+ myprint(codebuf); /* print this buffer */
+ prwboiler3(); /* print yet more boilerplate */
+ start_list(pos); /* start a list environment */
+} /* end CODESPECIAL_END */
+
+
+
+/*==================================================================*/
+ /* SYSTEM SPECIAL_ FUNCTIONS FOR INCORPORATING EXTENDER */
+ /* SPECIFIED CASE STATEMENTS FOR USER-DEFINED SPECIAL COMMANDS */
+
+
+/* SPECIAL_START_WITH_REQ special action at start of command with req param */
+void special_start_with_req(pos)
+PSENTRY pos; /* symbol entry */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_start_with_req) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_START_WITH_REQ */
+
+
+/* SPECIAL_ACTION_P_P1 special action between p'th and (p+1)'th req params */
+void special_action_p_p1(pos,p)
+PSENTRY pos; /* symbol entry */
+int p; /* number of p'th req param */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_p_p1) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_P_P1 */
+
+
+/* SPECIAL_ACTION_LAST_P special action after last req param */
+void special_action_last_p(pos,p)
+PSENTRY pos; /* symbol entry */
+int p; /* number of last req param */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+ case 59999: /* example coded special */
+ if (p == 1) { /* has only 1 req param */
+ codespecial_end(pos);
+ }
+ break;
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_last_p) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_LAST_P */
+
+
+/* SPECIAL_START_WITH_OPT special start for command with opt param */
+void special_start_with_opt(pos)
+PSENTRY pos; /* symbol entry */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+ case 59999: /* example coded special */
+ codespecial_start(pos);
+ default_start_with_opt(pos);
+ break;
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_start_with_opt) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_START_WITH_OPT */
+
+
+/* SPECIAL_ACTION_OPT_FIRST special action between opt and 1st param */
+void special_action_opt_first(pos)
+PSENTRY pos; /* symbol entry */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+ case 59999: /* example coded special */
+ default_end_start_opt(pos);
+ codespecial_p1(pos);
+ break;
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_opt_first) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_OPT_FIRST */
+
+
+/* SPECIAL_ACTION_P_OPT special action between param p and opt */
+void special_action_p_opt(pos,p)
+PSENTRY pos; /* symbol entry */
+int p; /* number of p'th req param */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_p_opt) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_P_OPT */
+
+
+/* SPECIAL_ACTION_LAST_OPT special action after last opt param */
+void special_action_last_opt(pos)
+PSENTRY pos; /* symbol entry */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_last_opt) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_LAST_OPT */
+
+
+/* SPECIAL_ACTION_NO_PARAM special action for command with no params */
+void special_action_no_param(pos)
+PSENTRY pos; /* symbol entry */
+{
+ int special_kind; /* user-specified special token */
+
+ special_kind = get_special_token(pos);
+
+ switch(special_kind) {
+ /* additional cases for specials added here */
+
+ /* end of cases for specials */
+ default: /* should not be here! */
+ warning("(special_action_no_param) Unrecognized SPECIAL");
+ tdebug_str_int("SPECIAL_TOKEN =",special_kind);
+ break;
+ } /* end of switch on user_kind */
+} /* end SPECIAL_ACTION_NO_PARAM */
+