Extension Libraries Subsystem

// typedefs

typedef void jnc_ExtensionLib_AddSourcesFunc(jnc_Module *module);
typedef void jnc_ExtensionLib_AddOpaqueClassTypeInfosFunc(jnc_Module *module);
typedef bool_t jnc_ExtensionLib_MapAddressesFunc(jnc_Module *module);
typedef void jnc_ExtensionLib_UpdateCapabilitiesFunc();
typedef jnc_ExtensionLib* jnc_DynamicExtensionLibMainFunc(jnc_DynamicExtensionLibHost *host);
typedef bool_t jnc_DynamicExtensionLibUnloadFunc();

typedef size_t jnc_StdLib_StdInputFunc(
    void *p,
    size_t size
    );

typedef size_t jnc_StdLib_StdOutputFunc(
    const void *p,
    size_t size
    );

// structs

struct jnc_DynamicExtensionLibHost;
struct jnc_ExtensionLib;

// global variables

JNC_SELECT_ANY char jnc_g_dynamicExtensionLibMainFuncName[] = "jncDynamicExtensionLibMain";
JNC_SELECT_ANY char jnc_g_dynamicExtensionLibUnloadFuncName[] = "jncDynamicExtensionLibUnload";

// global functions

jnc_ExtensionLib*
jnc_CoreLib_getLib();

jnc_ExtensionLib*
jnc_IntrospectionLib_getLib();

jnc_ExtensionLib*
jnc_StdLib_getLib();

jnc_ExtensionLib*
jnc_SysLib_getLib();

void
jnc_StdLib_setStdIo(
    jnc_StdLib_StdInputFunc* getsFunc,
    jnc_StdLib_StdOutputFunc* printOutFunc,
    jnc_StdLib_StdOutputFunc* printErrFunc
);

// macros

#define JNC_BEGIN_CLASS_TYPE_VTABLE(TypePrefix)
#define JNC_BEGIN_LIB_FUNCTION_MAP(LibPrefix)
#define JNC_BEGIN_LIB_OPAQUE_CLASS_TYPE_TABLE(LibPrefix)
#define JNC_BEGIN_LIB_SOURCE_FILE_TABLE(LibPrefix)
#define JNC_BEGIN_OPAQUE_CLASS_REQUIRE_TABLE(TypePrefix)
#define JNC_BEGIN_TYPE_FUNCTION_MAP(TypePrefix)
#define JNC_CLASS_TYPE_VTABLE_ENTRY(function)
#define JNC_DECLARE_CLASS_TYPE(TypePrefix)
#define JNC_DECLARE_CLASS_TYPE_STATIC_METHODS(TypePrefix)
#define JNC_DECLARE_LIB(LibPrefix)
#define JNC_DECLARE_OPAQUE_CLASS_TYPE(TypePrefix)
#define JNC_DECLARE_OPAQUE_CLASS_TYPE_STATIC_METHODS(TypePrefix)
#define JNC_DECLARE_TYPE(TypePrefix)

#define JNC_DECLARE_TYPE_EX( \
    TypePrefix, \
    JncType \
)

#define JNC_DECLARE_TYPE_STATIC_METHODS(TypePrefix)

#define JNC_DECLARE_TYPE_STATIC_METHODS_EX( \
    TypePrefix, \
    JncType \
)

#define JNC_DEFINE_CLASS_TYPE( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot \
)

#define JNC_DEFINE_LIB( \
    LibPrefix, \
    libGuid, \
    libName, \
    libDescription \
)

#define JNC_DEFINE_LIB_EX( \
    LibPrefix, \
    libGuid, \
    libName, \
    libDescription, \
    updateCapabilities \
)

#define JNC_DEFINE_OPAQUE_CLASS_TYPE( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot, \
    Type, \
    markOpaqueGcRootsFunc \
)

#define JNC_DEFINE_OPAQUE_CLASS_TYPE_EX( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot, \
    Type, \
    markOpaqueGcRootsFunc, \
    requireOpaqueItemsFunc, \
    isNonCreatable \
)

#define JNC_DEFINE_OPAQUE_CLASS_TYPE_NC( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot, \
    Type, \
    markOpaqueGcRootsFunc \
)

#define JNC_DEFINE_OPAQUE_CLASS_TYPE_REQ( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot, \
    Type, \
    markOpaqueGcRootsFunc \
)

#define JNC_DEFINE_TYPE( \
    TypePrefix, \
    qualifiedName, \
    libGuid, \
    cacheSlot \
)

#define JNC_DEFINE_TYPE_EX( \
    TypePrefix, \
    JncType, \
    qualifiedName, \
    libGuid, \
    cacheSlot \
)

#define JNC_END_CLASS_TYPE_VTABLE()
#define JNC_END_LIB_FUNCTION_MAP()
#define JNC_END_LIB_OPAQUE_CLASS_TYPE_TABLE()
#define JNC_END_LIB_SOURCE_FILE_TABLE()
#define JNC_END_OPAQUE_CLASS_REQUIRE_TABLE()
#define JNC_END_TYPE_FUNCTION_MAP()

#define JNC_FIND_ITEM_IMPL( \
    name, \
    findMethod, \
    itemKind, \
    ItemType, \
    item \
)

#define JNC_LIB_IMPORT(fileName)
#define JNC_LIB_OPAQUE_CLASS_TYPE_TABLE_ENTRY(TypePrefix)

#define JNC_LIB_REQUIRE( \
    itemKind, \
    name \
)

#define JNC_LIB_REQUIRE_EX( \
    itemKind, \
    name, \
    flags \
)

#define JNC_LIB_REQUIRE_TYPE( \
    typeKind, \
    name \
)

#define JNC_LIB_REQUIRE_TYPE_EX( \
    typeKind, \
    name, \
    flags \
)

#define JNC_LIB_SOURCE_FILE( \
    fileName, \
    sourceVar \
)

#define JNC_MAP_AUTOGET_PROPERTY( \
    name, \
    setter \
)

#define JNC_MAP_AUTOGET_PROPERTY_IMPL( \
    name, \
    findMethod, \
    setter \
)

#define JNC_MAP_AUTOGET_PROPERTY_Q( \
    name, \
    setter \
)

#define JNC_MAP_BINARY_OPERATOR( \
    opKind, \
    p \
)

#define JNC_MAP_CALL_OPERATOR(p)

#define JNC_MAP_CAST_OPERATOR( \
    i, \
    p \
)

#define JNC_MAP_CONSTRUCTOR(p)

#define JNC_MAP_CONST_PROPERTY( \
    name, \
    getter \
)

#define JNC_MAP_CONST_PROPERTY_IMPL( \
    name, \
    findMethod, \
    getter \
)

#define JNC_MAP_CONST_PROPERTY_Q( \
    name, \
    getter \
)

#define JNC_MAP_DESTRUCTOR(p)

#define JNC_MAP_FUNCTION( \
    name, \
    p \
)

#define JNC_MAP_FUNCTION_IMPL( \
    function, \
    p \
)

#define JNC_MAP_FUNCTION_Q( \
    name, \
    p \
)

#define JNC_MAP_OVERLOAD(p)

#define JNC_MAP_OVERLOADABLE_FUNCTION( \
    item, \
    p \
)

#define JNC_MAP_PROPERTY( \
    name, \
    getter, \
    setter \
)

#define JNC_MAP_PROPERTY_GETTER( \
    prop, \
    p \
)

#define JNC_MAP_PROPERTY_IMPL( \
    name, \
    findMethod, \
    getter, \
    setter \
)

#define JNC_MAP_PROPERTY_Q( \
    name, \
    getter, \
    setter \
)

#define JNC_MAP_PROPERTY_SETTER( \
    prop, \
    p \
)

#define JNC_MAP_TYPE(TypePrefix)

#define JNC_MAP_TYPE_IMPL( \
    TypePrefix, \
    isRequired \
)

#define JNC_MAP_TYPE_REQ(TypePrefix)

#define JNC_MAP_UNARY_OPERATOR( \
    opKind, \
    p \
)

#define JNC_MAP_VARIABLE( \
    name, \
    p \
)

#define JNC_MAP_VARIABLE_IMPL( \
    name, \
    findMethod, \
    p \
)

#define JNC_MAP_VARIABLE_Q( \
    name, \
    p \
)

#define JNC_OPAQUE_CLASS_REQUIRE( \
    itemKind, \
    name \
)

#define JNC_OPAQUE_CLASS_REQUIRE_TYPE( \
    typeKind, \
    name \
)

#define jnc_pvoid_cast(x)