XROAD
xroad_string.h
Go to the documentation of this file.
1 
6 #pragma once
7 
8 #ifndef _GNU_SOURCE
9 # define _GNU_SOURCE
10 #endif
11 
12 #include "xroad_aux.h"
13 #include "xroad_format.h"
14 #include <string.h>
15 #include <stdbool.h>
16 #include <stdio.h>
17 #include <stdarg.h>
18 #include <ctype.h>
19 
20 #ifdef __cplusplus
21 extern "C"
22 {
23 #endif
24 
29 {
30  uint32_t len;
31  const char* data;
32 };
33 
38 {
39  uint32_t len;
40  char data[0];
41 };
42 
48 #define xroad_str_concat(str1, str2) \
49 ({ \
50  xroad_str_t tmp_1234599 = (str1); \
51  xroad_str_t tmp_5432199 = (str2); \
52  char* data_1234 = (char*)malloc(tmp_1234599.len + tmp_5432199.len); \
53  memcpy(data_1234, tmp_1234599.data, tmp_1234599.len); \
54  memcpy(data_1234 + tmp_1234599.len, tmp_5432199.data, tmp_5432199.len); \
55  (xroad_str_t){tmp_1234599.len + tmp_5432199.len, data_1234}; \
56 })
57 
63 #define xroad_str_concata(str1, str2) \
64 ({ \
65  xroad_str_t tmp_1234599 = (str1); \
66  xroad_str_t tmp_5432199 = (str2); \
67  char* data_1234 = (char*)alloca(tmp_1234599.len + tmp_5432199.len); \
68  memcpy(data_1234, tmp_1234599.data, tmp_1234599.len); \
69  memcpy(data_1234 + tmp_1234599.len, tmp_5432199.data, tmp_5432199.len); \
70  (xroad_str_t){tmp_1234599.len + tmp_5432199.len, data_1234}; \
71 })
72 
78 #define xroad_str_to_cstr(str) \
79 ({ \
80  xroad_str_t _tmp_9023 = (str); \
81  char* res = (char*)alloca(_tmp_9023.len + 1); \
82  res[_tmp_9023.len] = '\0'; \
83  (char*)memcpy(res, _tmp_9023.data, _tmp_9023.len); \
84 })
85 
90 #define xroad_str_cmp(a, b) \
91 ({ \
92  xroad_str_t tmp_1234599 = (a); \
93  xroad_str_t tmp_5432199 = (b); \
94  tmp_1234599.len == tmp_5432199.len ? \
95  strncmp(tmp_1234599.data, tmp_5432199.data, tmp_1234599.len) : \
96  (tmp_1234599.len < tmp_5432199.len ? -1 : 1); \
97 })
98 
103 #define xroad_str_startwith(a, prefix) \
104 ({ \
105  xroad_str_t a_1234599 = (a); \
106  xroad_str_t prefix_5432199 = (prefix); \
107  a_1234599.len < prefix_5432199.len ? false : !strncmp(a_1234599.data, prefix_5432199.data, prefix_5432199.len); \
108 })
109 
114 #define xroad_str_endwith(a, suffix) \
115 ({ \
116  xroad_str_t a_1234599 = (a); \
117  xroad_str_t suffix_5432199 = (suffix); \
118  bool res = a_1234599.len < suffix_5432199.len; \
119  if (!res) \
120  { \
121  uint32_t offset = a_1234599.len - suffix_5432199.len; \
122  res = !strncmp(a_1234599.data + offset, suffix_5432199.data, suffix_5432199.len); \
123  } \
124  res; \
125 }) \
126 
131 #define xroad_str_has(a, subs) \
132 ({ \
133  xroad_str_t a_1234599 = (a); \
134  xroad_str_t subs_5432199 = (subs); \
135  void* res_1234599 = memmem((void*)a_1234599.data, a_1234599.len, (void*)subs_5432199.data, subs_5432199.len); \
136  (int64_t)(!res_1234599 ? -1 : ((uint64_t)res_1234599 - (uint64_t)a_1234599.data)); \
137 })
138 
142 #define xroad_str_null (xroad_str_t){0, NULL}
143 
147 #define xroad_str_is_null(str) \
148 ({ \
149  xroad_str_t a = (str); \
150  (a.len == 0 && a.data == NULL); \
151 })
152 
156 #define xroad_str_is_empty(str) \
157 ({ \
158  xroad_str_t a = (str); \
159  (a.len == 0 && a.data != NULL); \
160 })
161 
165 #define xroad_str(str) (xroad_str_t){sizeof(str) - 1, str}
166 
170 #define xroad_str_from_arr(arr) (xroad_str_t){strnlen(arr, sizeof(arr)), arr}
171 
175 #define xroad_str_from_cstr(str) \
176  ({ \
177  char* _s_11_ = (char*)(str); \
178  (xroad_str_t){_s_11_ == NULL ? 0 : (uint32_t)strlen(_s_11_), _s_11_}; \
179  })
180 
184 #define xroad_str_len(str, len) \
185  ({ \
186  char* _s_11_ = (char*)(str); \
187  (xroad_str_t){_s_11_ == NULL ? 0U : (uint32_t)(len), _s_11_}; \
188  })
189 
193 #define xroad_str_free(str) \
194 ({ \
195  xroad_str_t* ptr = (xroad_str_t*)&(str); \
196  free((void*)ptr->data); \
197  ptr->data = NULL; \
198  ptr->len = 0; \
199 })
200 
204 #define xroad_str_dup(str) \
205 ({ \
206  xroad_str_t a = (str); \
207  (xroad_str_t){a.len, a.data == NULL ? NULL : strndup(a.data, a.len)}; \
208 })
209 
213 #define xroad_str_dupa(str) \
214 ({ \
215  xroad_str_t a = (str); \
216  (xroad_str_t){a.len, a.data == NULL ? NULL : strndupa(a.data, a.len)}; \
217 })
218 
222 #define xroad_str_alloc(str) \
223 ({ \
224  const char* tmp = (str); \
225  (xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdup(tmp)}; \
226 })
227 
231 #define xroad_str_alloc_len(str, len) \
232 ({ \
233  uint32_t len_77 = (len); \
234  const char* tmp = (str); \
235  (xroad_str_t){len_77, tmp == NULL ? NULL : strndup(tmp, len_77)}; \
236 })
237 
241 #define xroad_str_alloca(str) \
242 ({ \
243  const char* tmp = (str); \
244  (xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdupa(tmp)}; \
245 })
246 
250 #define xroad_str_fixed_size(str) sizeof((str)->data)
251 
255 #define xroad_str_from_fixed(str) \
256 ({ \
257  __typeof__ (str) ptr_6584 = (str); \
258  ptr_6584 ? xroad_str_len(ptr_6584->data, ptr_6584->len) : xroad_str_null; \
259 })
260 
267 #define xroad_str_decl(name, sz) \
268 typedef struct { uint32_t len; char data[sz]; } name ## _t;
269 
276 #define xroad_str_fixed_set(str, val) \
277 ({ \
278  __typeof__ (str) _str_123 = (str); \
279  xroad_str_t _val_123 = (val); \
280  _str_123->len = xroad_min(xroad_str_fixed_size(_str_123), _val_123.len); \
281  if (!xroad_str_is_null(_val_123)) \
282  { \
283  memcpy(_str_123->data, _val_123.data, _str_123->len); \
284  } \
285  _str_123->len; \
286 })
287 
295 #define xroad_str_fixed_vformat(str, fmt, ap) \
296 ({ \
297  __typeof__ (str) str_123_ = (str); \
298  int32_t res_123_ = xroad_vformat(str_123_->data, xroad_str_fixed_size(str_123_), fmt, ap); \
299  if (res_123_ > 0) \
300  { \
301  str_123_->len = xroad_min((uint32_t)res_123_, xroad_str_fixed_size(str_123_)); \
302  } \
303  res_123_; \
304 })
305 
312 #define xroad_str_fixed_format(str, fmt, ...) \
313 ({ \
314  __typeof__ (str) str_123_ = (str); \
315  int32_t res_123_ = xroad_format(str_123_->data, xroad_str_fixed_size(str_123_), fmt, ## __VA_ARGS__); \
316  if (res_123_ > 0) \
317  { \
318  str_123_->len = xroad_min((uint32_t)res_123_, xroad_str_fixed_size(str_123_)); \
319  } \
320  res_123_; \
321 })
322 
329 #define xroad_str_fixed_concat(lhs, rhs) \
330 ({ \
331  __typeof__ (lhs) _lhs = (lhs); \
332  xroad_str_t _rhs = (rhs); \
333  uint32_t cat_len_123 = xroad_min((xroad_str_fixed_size(_lhs) - _lhs->len), _rhs.len); \
334  memcpy(_lhs->data + _lhs->len, _rhs.data, cat_len_123); \
335  _lhs->len += cat_len_123; \
336  cat_len_123; \
337 })
338 
344 #define xroad_str_fixed_to_cstr(str) \
345 ({ \
346  __typeof__ (str) tmp_1234599 = (str); \
347  char* res = NULL; \
348  if (tmp_1234599) \
349  { \
350  char* tmp_991 = (char*)alloca(tmp_1234599->len + 1); \
351  tmp_991[tmp_1234599->len] = 0; \
352  res = (char*)memcpy(tmp_991, tmp_1234599->data, tmp_1234599->len); \
353  } \
354  res; \
355 })
356 
361 #define xroad_str_fixed_to_upper(str) \
362 ({ \
363  __typeof__ (str) tmp_1234599 = (str); \
364  for(uint32_t i = 0; i < tmp_1234599->len; ++i) \
365  { \
366  tmp_1234599->data[i] = toupper(tmp_1234599->data[i]); \
367  } \
368 })
369 
375 #define xroad_str_to_sql(v) \
376 ({ \
377  xroad_str_t s = (v); \
378  char* buf = "NULL"; \
379  uint32_t len = 4; \
380  if (!xroad_str_is_null(s)) \
381  { \
382  buf = alloca(s.len * 2 + 2); \
383  char* it = buf; \
384  *it = '\''; \
385  ++it; \
386  len = 1; \
387  for (int32_t i = 0; i < s.len; ++i) \
388  { \
389  if (s.data[i] == '\'') \
390  { \
391  *it = '\''; \
392  ++it; \
393  len += 1; \
394  } \
395  *it = s.data[i]; \
396  ++it; \
397  len += 1; \
398  } \
399  *it = '\''; \
400  len += 1; \
401  } \
402  xroad_str_len(buf, len); \
403 })
404 
410 #define xroad_str_to_lower(v) \
411 ({ \
412  xroad_str_t s = (v); \
413  char* buf = alloca(s.len); \
414  for(int32_t i = 0;i < s.len; ++i) \
415  { \
416  buf[i] = tolower(s.data[i]); \
417  } \
418  (xroad_str_t){s.len, buf}; \
419 })
420 
421 #ifdef __cplusplus
422 }
423 #endif
Definition: xroad_string.h:38
uint32_t len
string length
Definition: xroad_string.h:39
char data[0]
string data
Definition: xroad_string.h:40
Definition: xroad_string.h:29
const char * data
string data
Definition: xroad_string.h:31
uint32_t len
length of string
Definition: xroad_string.h:30