48 #define xroad_str_concat(str1, str2) \
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}; \
63 #define xroad_str_concata(str1, str2) \
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}; \
78 #define xroad_str_to_cstr(str) \
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); \
90 #define xroad_str_cmp(a, b) \
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); \
103 #define xroad_str_startwith(a, prefix) \
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); \
114 #define xroad_str_endwith(a, suffix) \
116 xroad_str_t a_1234599 = (a); \
117 xroad_str_t suffix_5432199 = (suffix); \
118 bool res = a_1234599.len < suffix_5432199.len; \
121 uint32_t offset = a_1234599.len - suffix_5432199.len; \
122 res = !strncmp(a_1234599.data + offset, suffix_5432199.data, suffix_5432199.len); \
131 #define xroad_str_has(a, subs) \
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)); \
142 #define xroad_str_null (xroad_str_t){0, NULL}
147 #define xroad_str_is_null(str) \
149 xroad_str_t a = (str); \
150 (a.len == 0 && a.data == NULL); \
156 #define xroad_str_is_empty(str) \
158 xroad_str_t a = (str); \
159 (a.len == 0 && a.data != NULL); \
165 #define xroad_str(str) (xroad_str_t){sizeof(str) - 1, str}
170 #define xroad_str_from_arr(arr) (xroad_str_t){strnlen(arr, sizeof(arr)), arr}
175 #define xroad_str_from_cstr(str) \
177 char* _s_11_ = (char*)(str); \
178 (xroad_str_t){_s_11_ == NULL ? 0 : (uint32_t)strlen(_s_11_), _s_11_}; \
184 #define xroad_str_len(str, len) \
186 char* _s_11_ = (char*)(str); \
187 (xroad_str_t){_s_11_ == NULL ? 0U : (uint32_t)(len), _s_11_}; \
193 #define xroad_str_free(str) \
195 xroad_str_t* ptr = (xroad_str_t*)&(str); \
196 free((void*)ptr->data); \
204 #define xroad_str_dup(str) \
206 xroad_str_t a = (str); \
207 (xroad_str_t){a.len, a.data == NULL ? NULL : strndup(a.data, a.len)}; \
213 #define xroad_str_dupa(str) \
215 xroad_str_t a = (str); \
216 (xroad_str_t){a.len, a.data == NULL ? NULL : strndupa(a.data, a.len)}; \
222 #define xroad_str_alloc(str) \
224 const char* tmp = (str); \
225 (xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdup(tmp)}; \
231 #define xroad_str_alloc_len(str, len) \
233 uint32_t len_77 = (len); \
234 const char* tmp = (str); \
235 (xroad_str_t){len_77, tmp == NULL ? NULL : strndup(tmp, len_77)}; \
241 #define xroad_str_alloca(str) \
243 const char* tmp = (str); \
244 (xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdupa(tmp)}; \
250 #define xroad_str_fixed_size(str) sizeof((str)->data)
255 #define xroad_str_from_fixed(str) \
257 __typeof__ (str) ptr_6584 = (str); \
258 ptr_6584 ? xroad_str_len(ptr_6584->data, ptr_6584->len) : xroad_str_null; \
267 #define xroad_str_decl(name, sz) \
268 typedef struct { uint32_t len; char data[sz]; } name ## _t;
276 #define xroad_str_fixed_set(str, val) \
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)) \
283 memcpy(_str_123->data, _val_123.data, _str_123->len); \
295 #define xroad_str_fixed_vformat(str, fmt, ap) \
297 __typeof__ (str) str_123_ = (str); \
298 int32_t res_123_ = xroad_vformat(str_123_->data, xroad_str_fixed_size(str_123_), fmt, ap); \
301 str_123_->len = xroad_min((uint32_t)res_123_, xroad_str_fixed_size(str_123_)); \
312 #define xroad_str_fixed_format(str, fmt, ...) \
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__); \
318 str_123_->len = xroad_min((uint32_t)res_123_, xroad_str_fixed_size(str_123_)); \
329 #define xroad_str_fixed_concat(lhs, rhs) \
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; \
344 #define xroad_str_fixed_to_cstr(str) \
346 __typeof__ (str) tmp_1234599 = (str); \
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); \
361 #define xroad_str_fixed_to_upper(str) \
363 __typeof__ (str) tmp_1234599 = (str); \
364 for(uint32_t i = 0; i < tmp_1234599->len; ++i) \
366 tmp_1234599->data[i] = toupper(tmp_1234599->data[i]); \
375 #define xroad_str_to_sql(v) \
377 xroad_str_t s = (v); \
378 char* buf = "NULL"; \
380 if (!xroad_str_is_null(s)) \
382 buf = alloca(s.len * 2 + 2); \
387 for (int32_t i = 0; i < s.len; ++i) \
389 if (s.data[i] == '\'') \
402 xroad_str_len(buf, len); \
410 #define xroad_str_to_lower(v) \
412 xroad_str_t s = (v); \
413 char* buf = alloca(s.len); \
414 for(int32_t i = 0;i < s.len; ++i) \
416 buf[i] = tolower(s.data[i]); \
418 (xroad_str_t){s.len, buf}; \
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