XROAD
xroad_net_buf.h
Go to the documentation of this file.
1 #pragma once
8 #include "xroad_sock_fwd.h"
10 #include <logger/xroad_logger.h>
11 #include <stdint.h>
12 #include <stdlib.h>
13 
14 #ifdef __cplusplus
15 extern "C"
16 {
17 #endif
18 
23 {
24  char* begin;
25  char* data_begin;
26  char* data_end;
27  char* end;
28  size_t max_size;
29 };
30 
39 xroad_errno_t xroad_net_buf_create(xroad_net_buf_t* buf, size_t size, size_t max_size);
40 
49 xroad_errno_t xroad_net_buf_resize(xroad_net_buf_t* buf, size_t size);
50 
58 xroad_errno_t xroad_net_buf_increase(xroad_net_buf_t* buf, size_t size);
59 
65 
71 
76 static inline void xroad_net_buf_reset(xroad_net_buf_t* buf)
77 {
78  buf->data_begin = buf->data_end = buf->begin;
79 }
80 
86 static inline size_t xroad_net_buf_get_data_size(const xroad_net_buf_t* buf)
87 {
88  return buf->data_end - buf->data_begin;
89 }
90 
96 static inline size_t xroad_net_buf_get_size(const xroad_net_buf_t* buf)
97 {
98  return buf->end - buf->begin;
99 }
100 
106 static inline size_t xroad_net_buf_get_free_size(const xroad_net_buf_t* buf)
107 {
108  return buf->end - buf->data_end;
109 }
110 
117 static inline char* xroad_net_buf_alloc(xroad_net_buf_t* buf, size_t len)
118 {
119  if (xroad_net_buf_get_free_size(buf) < len)
120  {
121  if (XROAD_ERROR_NO_MORE_RESOURCES == xroad_net_buf_increase(buf, len))
122  {
123  xroad_log_error("no more space in buffer");
124  return NULL;
125  }
126  }
127  char* ptr = buf->data_end;
128  buf->data_end += len;
129  return ptr;
130 }
131 
138 static inline char* xroad_net_buf_free(xroad_net_buf_t* buf, ssize_t pop_sz)
139 {
140  if (pop_sz < 0)
141  {
142  return buf->data_begin;
143  }
144  if ((size_t)pop_sz >= xroad_net_buf_get_data_size(buf))
145  {
146  xroad_net_buf_reset(buf);
147  }
148  else
149  {
150  buf->data_begin += pop_sz;
151  }
152  return buf->data_begin;
153 }
154 
155 #ifdef NDEBUG
156 # define xroad_net_buf_check(buf)
157 #else
158 # define xroad_net_buf_check(buf) \
159  { \
160  xroad_net_buf_t* buf777_ = (buf); \
161  assert(*(uint32_t*)buf777_->end == 0xDEADBEAF); \
162  assert(buf777_->data_begin >= buf777_->begin); \
163  assert(buf777_->data_begin <= buf777_->end); \
164  assert(buf777_->data_end >= buf777_->begin); \
165  assert(buf777_->data_end <= buf777_->end); \
166  assert(buf777_->data_begin <= buf777_->data_end); \
167  }
168 #endif
169 
170 #ifdef __cplusplus
171 }
172 #endif
Definition: xroad_net_buf.h:23
char * data_end
data end
Definition: xroad_net_buf.h:26
char * begin
buffer begin
Definition: xroad_net_buf.h:24
char * data_begin
data begin
Definition: xroad_net_buf.h:25
size_t max_size
maximum buffer size
Definition: xroad_net_buf.h:28
char * end
buffer end
Definition: xroad_net_buf.h:27
#define xroad_log_error(fmt,...)
Definition: xroad_logger.h:103
xroad_errno_t xroad_net_buf_resize(xroad_net_buf_t *buf, size_t size)
void xroad_net_buf_destroy(xroad_net_buf_t *buf)
void xroad_net_buf_free_space(xroad_net_buf_t *buf)
xroad_errno_t xroad_net_buf_create(xroad_net_buf_t *buf, size_t size, size_t max_size)
xroad_errno_t xroad_net_buf_increase(xroad_net_buf_t *buf, size_t size)