diff options
Diffstat (limited to 'src/internal/treebnf_driver_impl.h')
-rw-r--r-- | src/internal/treebnf_driver_impl.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/internal/treebnf_driver_impl.h b/src/internal/treebnf_driver_impl.h new file mode 100644 index 0000000..7fcdd43 --- /dev/null +++ b/src/internal/treebnf_driver_impl.h @@ -0,0 +1,127 @@ +/**************************************************************/ +/* treebnf: a tree oriented bnf library */ +/* Copyright (C) 2024 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.TREEBNF. */ +/**************************************************************/ + +#ifndef TREEBNF_DRIVER_IMPL_H +#define TREEBNF_DRIVER_IMPL_H + +#include <stdint.h> +#include <dirent.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include <treebnf/treebnf.h> +#include "argv/argv.h" + +#define TBNF_OPTV_ELEMENTS 128 + +extern const struct argv_option tbnf_default_options[]; + +enum app_tags { + TAG_HELP, + TAG_VERSION, +}; + +struct tbnf_driver_ctx_impl { + struct tbnf_common_ctx cctx; + struct tbnf_driver_ctx ctx; + struct tbnf_fd_ctx fdctx; + int fdtmpin; + const struct tbnf_unit_ctx * euctx; + const char * eunit; + struct tbnf_error_info ** errinfp; + struct tbnf_error_info ** erricap; + struct tbnf_error_info * erriptr[64]; + struct tbnf_error_info erribuf[64]; +}; + +struct tbnf_unit_ctx_impl { + const char * path; + struct tbnf_unit_ctx uctx; + struct tbnf_raw_input map; + struct stat st; +}; + + +static inline struct tbnf_driver_ctx_impl * tbnf_get_driver_ictx( + const struct tbnf_driver_ctx * dctx) +{ + uintptr_t addr; + + if (dctx) { + addr = (uintptr_t)dctx - offsetof(struct tbnf_driver_ctx_impl,ctx); + return (struct tbnf_driver_ctx_impl *)addr; + } + + return 0; +} + +static inline struct tbnf_unit_ctx_impl * tbnf_get_unit_ictx( + const struct tbnf_unit_ctx * uctx) +{ + struct tbnf_unit_ctx_impl * ictx; + uintptr_t addr; + + addr = (uintptr_t)uctx - offsetof(struct tbnf_unit_ctx_impl,uctx); + ictx = (struct tbnf_unit_ctx_impl *)addr; + return ictx; +} + +static inline void tbnf_driver_set_ectx( + const struct tbnf_driver_ctx * dctx, + const struct tbnf_unit_ctx * uctx, + const char * unit) +{ + struct tbnf_driver_ctx_impl * ictx; + + ictx = tbnf_get_driver_ictx(dctx); + ictx->euctx = uctx; + ictx->eunit = unit; +} + +static inline int tbnf_driver_fdin(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fdin; +} + +static inline int tbnf_driver_fdout(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fdout; +} + +static inline int tbnf_driver_fderr(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fderr; +} + +static inline int tbnf_driver_fdlog(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fdlog; +} + +static inline int tbnf_driver_fdcwd(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fdcwd; +} + +static inline int tbnf_driver_fddst(const struct tbnf_driver_ctx * dctx) +{ + struct tbnf_fd_ctx fdctx; + tbnf_lib_get_driver_fdctx(dctx,&fdctx); + return fdctx.fddst; +} + +#endif |