#ifndef FZL_EXTERN_H #define FZL_EXTERN_H #include #include #include typedef enum { FZL_EXTERN_KIND_HANDLE, FZL_EXTERN_KIND_STRUCT, FZL_EXTERN_KIND_REF, FZL_EXTERN_KIND_ALIAS, } fzl_extern_kind_t; // Type reference descriptor typedef struct { bool is_primitive; union { fzl_type_t primitive; size_t type_slot; }; } fzl_extern_type_ref_t; // Structure field descriptor typedef struct { char *name; fzl_extern_type_ref_t type; } fzl_extern_struct_field_t; // Type descriptor typedef struct { size_t lib_slot; char *name; fzl_extern_kind_t kind; union { // Structure struct { fzl_extern_struct_field_t *fields; size_t fields_count; } structure; // Pointer (ref) fzl_extern_type_ref_t ref_target; // Alias fzl_extern_type_ref_t alias_target; }; } fzl_extern_type_t; // Function argument descriptor typedef struct { char *name; fzl_extern_type_ref_t type; bool is_out; } fzl_extern_arg_t; // Function descriptor typedef struct { size_t lib_slot; char *symbol_name; char *used_name; bool has_return; fzl_extern_type_ref_t ret_type; fzl_extern_arg_t *args; size_t args_count; } fzl_extern_fn_t; // Library descriptor typedef struct { char *name; } fzl_extern_lib_t; #endif // FZL_EXTERN_H