#ifndef APIMAGIC_DRIVER_IMPL_H #define APIMAGIC_DRIVER_IMPL_H #include #include #include #include #include "apimagic_dprintf_impl.h" #include "argv/argv.h" #ifndef AMGC_TAB_WIDTH #define AMGC_TAB_WIDTH 8 #endif #define AMGC_OPTV_ELEMENTS 64 extern const struct argv_option amgc_default_options[]; enum app_tags { TAG_HELP, TAG_VERSION, TAG_PRINT_ENUMS, TAG_LIST_ENUMS, TAG_PRINT_TYPEDEFS, TAG_PRINT_STRUCTS, TAG_PRINT_UNIONS, TAG_LANG_STD, }; struct amgc_driver_ctx_impl { struct amgc_common_ctx cctx; struct amgc_driver_ctx ctx; struct amgc_fd_ctx fdctx; struct amgc_action * actions; struct compilation_env_t ccenv; int fdtmpin; const struct amgc_unit_ctx * euctx; const char * eunit; struct amgc_error_info ** errinfp; struct amgc_error_info ** erricap; struct amgc_error_info * erriptr[64]; struct amgc_error_info erribuf[64]; }; struct amgc_unit_ctx_impl { const struct amgc_driver_ctx * dctx; const char * path; struct amgc_common_ctx cctx; struct amgc_unit_ctx uctx; struct amgc_unit_meta meta; struct amgc_unit_entities * entities; struct compilation_unit_t ccunit; }; static inline struct amgc_driver_ctx_impl * amgc_get_driver_ictx( const struct amgc_driver_ctx * dctx) { uintptr_t addr; if (dctx) { addr = (uintptr_t)dctx - offsetof(struct amgc_driver_ctx_impl,ctx); return (struct amgc_driver_ctx_impl *)addr; } return 0; } static inline void amgc_driver_set_ectx( const struct amgc_driver_ctx * dctx, const struct amgc_unit_ctx * uctx, const char * unit) { struct amgc_driver_ctx_impl * ictx; ictx = amgc_get_driver_ictx(dctx); ictx->euctx = uctx; ictx->eunit = unit; } static inline int amgc_driver_fdin(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fdin; } static inline int amgc_driver_fdout(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fdout; } static inline int amgc_driver_fderr(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fderr; } static inline int amgc_driver_fdlog(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fdlog; } static inline int amgc_driver_fdcwd(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fdcwd; } static inline int amgc_driver_fddst(const struct amgc_driver_ctx * dctx) { struct amgc_fd_ctx fdctx; amgc_get_driver_fdctx(dctx,&fdctx); return fdctx.fddst; } #endif