Artifact
de3b19ccbb2c27cd3f3f86f35174426f81702618:
- File
libk/com.c
— part of check-in
[2bf43d6d47]
at
2021-08-17 23:10:59
on branch usb
— Count map entries for com_query.
(user:
csmith
size: 2313)
[more...]
#include "com.h"
#if INTERFACE
#include <stddef.h>
typedef void * (*interface_query_t)(void *, iid_t iid);
#define INTERFACE_IMPL_QUERY(iface, container, member) \
void * INTERFACE_IMPL_QUERY_NAME(iface, container)(void * i, iid_t id) \
{ \
return com_query(INTERFACE_MAP_NAME(container), countof(INTERFACE_MAP_NAME(container)), id, container_of(i, container, member)); \
}
#define INTERFACE_OPS_TYPE(iface) iface ## _ops
static iface ## _ops container ## _ ## iface
#define INTERFACE_IMPL_QUERY_METHOD(iface, container) .query = INTERFACE_IMPL_QUERY_NAME(iface, container)
#define INTERFACE_IMPL_METHOD(method, method_impl) , .method = method_impl
#define INTERFACE_IMPL_NAME(iface, container) container ## _ ## iface
#define INTERFACE_IMPL_QUERY_NAME(iface, container) container ## _ ## iface ## _ ## query
struct interface_map_t {
iid_t id;
int offset;
};
#define METHOD_PROLOG(iface, container, member) container * pThis = container_of(iface, container, member)
#define INTERFACE_MAP_NAME(container) container ## _map
#define INTERFACE_MAP_ENTRY(container, iid, member) { iid, offsetof(container, member) }
#define INTERFACE_MAP_END(container) {0,0} };
typedef const char * const iid_t;
#if 0
struct query_t {
query_t_ops * ops;
};
struct query_t_ops {
void * (*query)(void *, iid_t * iid);
};
struct anon_test_t {
anon_test_t_ops * ops;
};
struct anon_test_t_ops : query_t_ops {
void (*foo)();
};
#endif
#endif
exception_def InterfaceNotFoundException = {"InterfaceNotFoundException", &Exception};
void * com_query(interface_map_t * map, int mapnum, iid_t id, void * base)
{
for(int i=0; i<mapnum; i++) {
if (id == map[i].id) {
return PTR_BYTE_ADDRESS(base, map[i].offset);
}
}
KTHROWF(InterfaceNotFoundException, "Interface not found: %s", id);
}
#if 0
static void anon_test_foo(void * i)
{
}
typedef struct foo_t foo_t;
struct foo_t {
anon_test_t anon_test;
};
const iid_t iid_anon_test_t = "";
static interface_map_t foo_t_map [] =
{
INTERFACE_MAP_ENTRY(foo_t, iid_anon_test_t, anon_test),
};
static INTERFACE_IMPL_QUERY(anon_test_t, foo_t, anon_test)
static INTERFACE_OPS_TYPE(anon_test_t) INTERFACE_IMPL_NAME(anon_test_t, foo_t) = {
INTERFACE_IMPL_QUERY_METHOD(anon_test_t, foo_t)
INTERFACE_IMPL_METHOD(foo, anon_test_foo)
};
#endif