summaryrefslogtreecommitdiff
path: root/src/driver/tbnf_amain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/driver/tbnf_amain.c')
-rw-r--r--src/driver/tbnf_amain.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/driver/tbnf_amain.c b/src/driver/tbnf_amain.c
new file mode 100644
index 0000000..62e66bc
--- /dev/null
+++ b/src/driver/tbnf_amain.c
@@ -0,0 +1,97 @@
+/**************************************************************/
+/* treebnf: a tree oriented bnf library */
+/* Copyright (C) 2024 SysDeer Technologies, LLC */
+/* Released under GPLv2 and GPLv3; see COPYING.TREEBNF. */
+/**************************************************************/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <treebnf/treebnf.h>
+#include "treebnf_driver_impl.h"
+#include "treebnf_dprintf_impl.h"
+
+#ifndef TBNF_DRIVER_FLAGS
+#define TBNF_DRIVER_FLAGS TBNF_DRIVER_VERBOSITY_ERRORS \
+ | TBNF_DRIVER_VERBOSITY_USAGE
+#endif
+
+static const char vermsg[] = "%s%s%s (https://git.foss21.org/tulips/treebnf): "
+ "version %s%d.%d.%d%s.\n"
+ "[commit reference: %s%s%s]\n";
+
+static const char * const tbnf_ver_color[6] = {
+ "\x1b[1m\x1b[35m","\x1b[0m",
+ "\x1b[1m\x1b[32m","\x1b[0m",
+ "\x1b[1m\x1b[34m","\x1b[0m"
+};
+
+static const char * const tbnf_ver_plain[6] = {
+ "","",
+ "","",
+ "",""
+};
+
+static ssize_t tbnf_version(struct tbnf_driver_ctx * dctx, int fdout)
+{
+ const struct tbnf_source_version * verinfo;
+ const char * const * verclr;
+
+ verinfo = tbnf_api_source_version();
+ verclr = isatty(fdout) ? tbnf_ver_color : tbnf_ver_plain;
+
+ return tbnf_dprintf(
+ fdout,vermsg,
+ verclr[0],dctx->program,verclr[1],
+ verclr[2],verinfo->major,verinfo->minor,
+ verinfo->revision,verclr[3],
+ verclr[4],verinfo->commit,verclr[5]);
+}
+
+static void tbnf_perform_unit_actions(
+ const struct tbnf_driver_ctx * dctx,
+ struct tbnf_unit_ctx * uctx)
+{
+ uint64_t flags = dctx->cctx->fmtflags;
+
+ (void)dctx;
+ (void)uctx;
+ (void)flags;
+}
+
+static int tbnf_exit(struct tbnf_driver_ctx * dctx, int ret)
+{
+ tbnf_output_error_vector(dctx);
+ tbnf_lib_free_driver_ctx(dctx);
+ return ret;
+}
+
+int tbnf_main(char ** argv, char ** envp, const struct tbnf_fd_ctx * fdctx)
+{
+ int ret;
+ int fdout;
+ uint64_t flags;
+ struct tbnf_driver_ctx * dctx;
+ struct tbnf_unit_ctx * uctx;
+ const char ** unit;
+
+ flags = TBNF_DRIVER_FLAGS;
+ fdout = fdctx ? fdctx->fdout : STDOUT_FILENO;
+
+ if ((ret = tbnf_lib_get_driver_ctx(argv,envp,flags,fdctx,&dctx)))
+ return (ret == TBNF_USAGE)
+ ? !argv || !argv[0] || !argv[1]
+ : TBNF_ERROR;
+
+ if (dctx->cctx->drvflags & TBNF_DRIVER_VERSION)
+ if ((tbnf_version(dctx,fdout)) < 0)
+ return tbnf_exit(dctx,TBNF_ERROR);
+
+ for (unit=dctx->units; *unit; unit++) {
+ if (!(tbnf_lib_get_unit_ctx(dctx,*unit,&uctx))) {
+ tbnf_perform_unit_actions(dctx,uctx);
+ tbnf_lib_free_unit_ctx(uctx);
+ }
+ }
+
+ return tbnf_exit(dctx,dctx->errv[0] ? TBNF_ERROR : TBNF_OK);
+}