| #ifndef APIMAGIC_DRIVER_IMPL_H |
| #define APIMAGIC_DRIVER_IMPL_H |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <sys/types.h> |
| |
| #include <apimagic/apimagic.h> |
| #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 |