| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #include <elog.h>
-
- #include <string.h>
-
- elog_t *elog_init(void *arena, size_t size)
- {
- elog_t *ptr = (elog_t *)arena;
- ptr->buflen = size - sizeof(elog_t); // Adjust for the size of the elog_t structure
- ptr->offset = 0;
- return ptr;
- }
-
- int elog_put(elog_t *log, const char *const msg, int n, msgparam_t args[])
- {
- elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer)
- long esize = n * sizeof(msgparam_t); // 参数占用字节数
- long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成)
-
- if (newoff < log->buflen)
- {
- e->msgid = MSGPTR_MAKE(n, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e
- memcpy(e->data, args, esize); // 参数列表写入e
- log->offset = newoff;
- return 1;
- }
-
- return 0;
- }
-
- int elog_put_str(elog_t *log, const char *const msg, const char *str)
- {
- elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer)
- long esize = strlen(str) + 1; // 参数占用字节数
- long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成)
-
- if (newoff < log->buflen)
- {
- e->msgid = MSGPTR_MAKE(STR_FIXED_LEN, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e
- memcpy(e->data, str, esize); // 参数列表写入e
- log->offset = newoff;
- return 1;
- }
-
- return 0;
- }
-
- void elog_flush(elog_t *log, elog_flush_func_t func, void *ctx)
- {
- long off = 0;
-
- while (off < log->offset) // 也可以直接发送出去上位机,在上位机端解码
- {
- elog_entry_t *e = ((elog_entry_t *)(log->buffer + off));
- size_t len = MSGPTR_LEN(e->msgid) * sizeof(long);
-
- if (STR_FIXED_LEN == MSGPTR_LEN(e->msgid))
- {
- len = strlen((void *)e->data) + 1;
- }
-
- size_t incr = sizeof(elog_entry_t) + len;
- off += incr;
- func(e, incr, ctx); // 解出一个e[id + data]
- }
-
- log->offset = 0;
- }
|