/**************************************************************/ /* 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 #include #include #include #include #include #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