summaryrefslogtreecommitdiff
path: root/pkev.h
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-11-01 09:33:00 -0400
committerJonathan Bradley <jcb@pikum.xyz>2024-11-01 09:33:00 -0400
commit2f4944595da6011e15ba2a65637c916665bc95e0 (patch)
treeb062b7a9aac717f76f33dd9c8a40aef03e1bae41 /pkev.h
parente4d71f20517488dd48cec43a870af496b0f90c5b (diff)
pkev: first working version
This is a 'grug' implementation. Use the following defines to control size: PK_EV_MAX_COUNT = 16 PK_EV_MAX_CB_COUNT = 8
Diffstat (limited to 'pkev.h')
-rw-r--r--pkev.h54
1 files changed, 37 insertions, 17 deletions
diff --git a/pkev.h b/pkev.h
index e3dc772..5f183b6 100644
--- a/pkev.h
+++ b/pkev.h
@@ -9,16 +9,17 @@ typedef uint64_t pk_ev_id_T;
struct pk_ev_mgr *pk_ev_create();
void pk_ev_destroy(struct pk_ev_mgr *evmgr);
-typedef void (*pk_ev_cb)();
+typedef void (pk_ev_cb)();
-void pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid);
-void pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb);
-void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...);
+bool pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid);
+bool pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb);
+void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid);
#endif /* PK_EV_H */
#ifdef PK_IMPL_EV
+#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -27,14 +28,18 @@ void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...);
# define PK_EV_MAX_COUNT 16
#endif
+#ifndef PK_EV_MAX_CB_COUNT
+# define PK_EV_MAX_CB_COUNT 8
+#endif
+
struct pk_ev {
pk_ev_id_T evid;
- pk_ev_cb **cb;
+ pk_ev_cb *cb[PK_EV_MAX_CB_COUNT];
uint8_t n_cb;
};
struct pk_ev_mgr {
- struct pk_ev *ev;
+ struct pk_ev ev[PK_EV_MAX_COUNT];
uint8_t n_ev;
};
@@ -44,36 +49,51 @@ pk_ev_create()
struct pk_ev_mgr *mgr = (struct pk_ev_mgr*)malloc(sizeof(struct pk_ev_mgr));
if (mgr == NULL) return NULL;
memset(mgr, 0, sizeof(struct pk_ev_mgr));
- mgr->ev = (struct pk_ev*)malloc(sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
- if (mgr->ev == NULL) return NULL;
- memset(mgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
- mgr->n_ev = 0;
return mgr;
}
inline void
pk_ev_destroy(struct pk_ev_mgr *evmgr)
{
- memset(evmgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
- free(evmgr->ev);
+ assert(evmgr != NULL);
memset(evmgr, 0, sizeof(struct pk_ev_mgr));
free(evmgr);
}
-inline void
+inline bool
pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid)
{
- // TODO
+ assert(evmgr != NULL);
+ int i;
+ for (i = 0; i < evmgr->n_ev; ++i) {
+ if (evmgr->ev[i].evid == evid) {
+ return false;
+ }
+ }
+ evmgr->ev[evmgr->n_ev].evid = evid;
+ evmgr->n_ev++;
+ return true;
}
-inline void
+inline bool
pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb)
{
- // TODO
+ assert(evmgr != NULL);
+ struct pk_ev *ev = {0};
+ int i;
+ for (i = 0; i < evmgr->n_ev; ++i) {
+ if (evmgr->ev[i].evid == evid) {
+ ev = &evmgr->ev[i];
+ }
+ }
+ if (ev == NULL) return false;
+ ev->cb[ev->n_cb] = cb;
+ ev->n_cb++;
+ return true;
}
inline void
-pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...)
+pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid)
{
assert(evmgr != NULL);
uint8_t i;