選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

elog.c 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <elog.h>
  2. #include <string.h>
  3. elog_t *elog_init(void *arena, size_t size)
  4. {
  5. elog_t *ptr = (elog_t *)arena;
  6. ptr->buflen = size - sizeof(elog_t); // Adjust for the size of the elog_t structure
  7. ptr->offset = 0;
  8. return ptr;
  9. }
  10. int elog_put(elog_t *log, const char *const msg, int n, msgparam_t args[])
  11. {
  12. elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer)
  13. long esize = n * sizeof(msgparam_t); // 参数占用字节数
  14. long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成)
  15. if (newoff < log->buflen)
  16. {
  17. e->msgid = MSGPTR_MAKE(n, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e
  18. memcpy(e->data, args, esize); // 参数列表写入e
  19. log->offset = newoff;
  20. return 1;
  21. }
  22. return 0;
  23. }
  24. int elog_put_str(elog_t *log, const char *const msg, const char *str)
  25. {
  26. elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer)
  27. long esize = strlen(str) + 1; // 参数占用字节数
  28. long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成)
  29. if (newoff < log->buflen)
  30. {
  31. e->msgid = MSGPTR_MAKE(STR_FIXED_LEN, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e
  32. memcpy(e->data, str, esize); // 参数列表写入e
  33. log->offset = newoff;
  34. return 1;
  35. }
  36. return 0;
  37. }
  38. void elog_flush(elog_t *log, elog_flush_func_t func, void *ctx)
  39. {
  40. long off = 0;
  41. while (off < log->offset) // 也可以直接发送出去上位机,在上位机端解码
  42. {
  43. elog_entry_t *e = ((elog_entry_t *)(log->buffer + off));
  44. size_t len = MSGPTR_LEN(e->msgid) * sizeof(long);
  45. if (STR_FIXED_LEN == MSGPTR_LEN(e->msgid))
  46. {
  47. len = strlen((void *)e->data) + 1;
  48. }
  49. size_t incr = sizeof(elog_entry_t) + len;
  50. off += incr;
  51. func(e, incr, ctx); // 解出一个e[id + data]
  52. }
  53. log->offset = 0;
  54. }