/* * category: [data structure, core] * apply status: * edit status: * build status: * description: */ #ifndef IOBUFFER_H #define IOBUFFER_H #pragma once #include "config.h" #ifdef __cplusplus extern "C" { #endif /** compliance with .net framework's BinaryWriter BinaryReader */ #include #define IOBUF_T_I8 0 #define IOBUF_T_I4 1 #define IOBUF_T_I2 2 #define IOBUF_T_I1 3 #define IOBUF_T_STR 4 #define IOBUF_T_BUF 5 #define IOBUF_T_WSTR 6 /* uint16_t */ #define IOBUF_T_7BIT 7 #define IOBUF_T_WCSTR 8 /* wchar_t */ #if defined(_MSC_VER) #define IOBUF_T_WTSTR IOBUF_T_WSTR #else #define IOBUF_T_WTSTR IOBUF_T_WCSTR #endif //_MSC_VER #ifdef _WIN32 #define IOBUF_T_PARAM IOBUF_T_I4 #else #if (defined(__x86_64__) || defined(__aarch64__)) #define IOBUF_T_PARAM IOBUF_T_I8 #elif defined(__i386__) #define IOBUF_T_PARAM IOBUF_T_I4 #else #define IOBUF_T_PARAM IOBUF_T_I4 #endif #endif //_WIN32 #define IOBUF_T_PTR IOBUF_T_PARAM #if defined(_MSC_VER) #define IOBUF_WSTR_FLAG "w" #else #define IOBUF_WSTR_FLAG "m" #endif //_MSC_VER typedef struct iobuffer_t iobuffer_t; #ifndef DEBUD_MEM_TRACE TOOLKIT_API iobuffer_t* iobuffer_create(int head_capacity, int capacity); TOOLKIT_API iobuffer_t* iobuffer_clone(iobuffer_t* iobuf); #else TOOLKIT_API iobuffer_t* iobuffer_create_trace(int head_capacity, int capacity, const char* file, const char* function, int line); #define iobuffer_create(h,c) iobuffer_create_trace(h, c, MEM_TRACE_LOCATION) TOOLKIT_API iobuffer_t* iobuffer_clone_trace(iobuffer_t* iobuf, const char* file, const char* function, int line); #define iobuffer_clone(buf) iobuffer_clone_trace(buf, MEM_TRACE_LOCATION) #endif TOOLKIT_API void iobuffer_destroy(iobuffer_t *iobuf); TOOLKIT_API void iobuffer_reset(iobuffer_t *iobuf); TOOLKIT_API int iobuffer_get_capacity(iobuffer_t *iobuf); TOOLKIT_API void iobuffer_set_capacity(iobuffer_t *iobuf, int capacity); TOOLKIT_API char *iobuffer_data(iobuffer_t *iobuf, int offset); TOOLKIT_API int iobuffer_get_length(iobuffer_t *iobuf); TOOLKIT_API void iobuffer_set_length(iobuffer_t *iobuf, int length); TOOLKIT_API void iobuffer_push_count(iobuffer_t *iobuf, int n); TOOLKIT_API void iobuffer_pop_count(iobuffer_t *iobuf, int n); TOOLKIT_API void iobuffer_write(iobuffer_t *iobuf, int t, const void *v, int n); TOOLKIT_API void iobuffer_write_head(iobuffer_t *iobuf, int t, const void *v, int n); TOOLKIT_API void iobuffer_read(iobuffer_t *iobuf, int t, void *v, int *n); TOOLKIT_API int iobuffer_get_read_state(iobuffer_t *iobuf); TOOLKIT_API void iobuffer_restore_read_state(iobuffer_t *iobuf, int state); TOOLKIT_API int iobuffer_get_write_state(iobuffer_t *iobuf); TOOLKIT_API void iobuffer_restore_write_state(iobuffer_t *iobuf, int state); TOOLKIT_API void iobuffer_set_user_data(iobuffer_t *iobuf, void *user_data); TOOLKIT_API void *iobuffer_get_user_data(iobuffer_t *iobuf); TOOLKIT_API int iobuffer_inc_ref(iobuffer_t *iobuf); TOOLKIT_API int iobuffer_dec_ref(iobuffer_t *iobuf); TOOLKIT_API int iobuffer_cnt_ref(iobuffer_t *iobuf); #define LINKINFO_BUSSID_LEN 32 #define LINKINFO_TRACEID_LEN 32 #define LINKINFO_SPANID_LEN 16 #define LINKINFO_PARENTSPANID_LEN 16 TOOLKIT_API int iobuffer_get_linkId(iobuffer_t* iobuf); TOOLKIT_API void iobuffer_set_linkId(iobuffer_t* iobuf, int linkId); TOOLKIT_API void iobuffer_get_linkInfo(iobuffer_t* iobuf, char *t_bussId, char *t_tranceId, char *t_spanId, char *t_parentSpanId); TOOLKIT_API void iobuffer_set_linkInfo(iobuffer_t* iobuf, const char* t_bussId, const char* t_tranceId, const char* t_spanId, const char* t_parentSpanId); TOOLKIT_API void iobuffer_copy_linkInfo(iobuffer_t* dst, iobuffer_t* src); // fmt = "8421sb" TOOLKIT_API void iobuffer_format_readv(iobuffer_t *iobuf, const char *fmt, va_list arg); TOOLKIT_API void iobuffer_format_writev(iobuffer_t *iobuf, const char *fmt, va_list arg); TOOLKIT_API void iobuffer_format_read(iobuffer_t *iobuf, const char *fmt, ...); TOOLKIT_API void iobuffer_format_write(iobuffer_t *iobuf, const char *fmt, ...); TOOLKIT_API void iobuffer_format_writev_head(iobuffer_t *iobuf, const char *fmt, va_list arg); TOOLKIT_API void iobuffer_format_write_head(iobuffer_t *iobuf, const char *fmt, ...); typedef struct iobuffer_queue_t iobuffer_queue_t; TOOLKIT_API iobuffer_queue_t *iobuffer_queue_create(); TOOLKIT_API void iobuffer_queue_destroy(iobuffer_queue_t *queue); TOOLKIT_API iobuffer_t *iobuffer_queue_deque(iobuffer_queue_t *queue); TOOLKIT_API void iobuffer_queue_enqueue(iobuffer_queue_t *queue, iobuffer_t *iobuf); TOOLKIT_API int iobuffer_queue_count(iobuffer_queue_t *queue); TOOLKIT_API iobuffer_t *iobuffer_queue_head(iobuffer_queue_t *queue); TOOLKIT_API iobuffer_t *iobuffer_queue_tail(iobuffer_queue_t *queue); #ifdef __cplusplus } // extern "C" { #endif #endif // IOBUFFER_H