open5gs/lib/core/include/core_ringbuf.h

58 lines
1.4 KiB
C

#ifndef __CORE_RINGBUF_H__
#define __CORE_RINGBUF_H__
#include "core.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
struct _rbuf_header_t {
int head, tail, size;
char *pool;
};
#define rbuf_declare(__name, __size) \
struct { \
struct _rbuf_header_t h; \
char int_pool[(__size) + 1]; \
} __name
#define rbuf_declare_ext(__name) \
struct { \
struct _rbuf_header_t h; \
} __name
#define rbuf_init(__pname, __size) \
((__pname)->h.head = (__pname)->h.tail = 0, \
(__pname)->h.size = __size, \
(__pname)->h.pool = (__pname)->int_pool)
#define rbuf_init_ext(__pname, __size, __ext_pool) \
((__pname)->h.head = (__pname)->h.tail = 0, \
(__pname)->h.size = __size, \
(__pname)->h.pool = (char *)(__ext_pool))
#define rbuf_size(__pname) ((__pname)->h.size)
#define rbuf_is_empty(__pname) ((__pname)->h.head == (__pname)->h.tail)
#define rbuf_is_full(__pname) (rbuf_free_bytes(__pname) == 0)
CORE_DECLARE(int) rbuf_bytes(void *__pname);
CORE_DECLARE(int) rbuf_free_bytes(void *__pname);
CORE_DECLARE(int) rbuf_skip_write_pos(void *__pname, int __len);
CORE_DECLARE(int) rbuf_write(void *__pname, const char *__buf, int __buf_len);
CORE_DECLARE(int) rbuf_skip_read_pos(void *__pname, int __len);
CORE_DECLARE(int) rbuf_read(void *__pname, char *__buf, int __buf_len);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* ! __CORE_RINGBUF_H__ */