#include "xroad_aux.h"
#include "xroad_format.h"
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
Go to the source code of this file.
|
#define | _GNU_SOURCE |
|
#define | xroad_str_concat(str1, str2) |
|
#define | xroad_str_concata(str1, str2) |
|
#define | xroad_str_to_cstr(str) |
|
#define | xroad_str_cmp(a, b) |
|
#define | xroad_str_startwith(a, prefix) |
|
#define | xroad_str_endwith(a, suffix) |
|
#define | xroad_str_has(a, subs) |
|
#define | xroad_str_null (xroad_str_t){0, NULL} |
|
#define | xroad_str_is_null(str) |
|
#define | xroad_str_is_empty(str) |
|
#define | xroad_str(str) (xroad_str_t){sizeof(str) - 1, str} |
|
#define | xroad_str_from_arr(arr) (xroad_str_t){strnlen(arr, sizeof(arr)), arr} |
|
#define | xroad_str_from_cstr(str) |
|
#define | xroad_str_len(str, len) |
|
#define | xroad_str_free(str) |
|
#define | xroad_str_dup(str) |
|
#define | xroad_str_dupa(str) |
|
#define | xroad_str_alloc(str) |
|
#define | xroad_str_alloc_len(str, len) |
|
#define | xroad_str_alloca(str) |
|
#define | xroad_str_fixed_size(str) sizeof((str)->data) |
|
#define | xroad_str_from_fixed(str) |
|
#define | xroad_str_decl(name, sz) typedef struct { uint32_t len; char data[sz]; } name ## _t; |
|
#define | xroad_str_fixed_set(str, val) |
|
#define | xroad_str_fixed_vformat(str, fmt, ap) |
|
#define | xroad_str_fixed_format(str, fmt, ...) |
|
#define | xroad_str_fixed_concat(lhs, rhs) |
|
#define | xroad_str_fixed_to_cstr(str) |
|
#define | xroad_str_fixed_to_upper(str) |
|
#define | xroad_str_to_sql(v) |
|
#define | xroad_str_to_lower(v) |
|
◆ xroad_str
#define xroad_str |
( |
|
str | ) |
(xroad_str_t){sizeof(str) - 1, str} |
convert string literal(!) to xroad_str_t
◆ xroad_str_alloc
#define xroad_str_alloc |
( |
|
str | ) |
|
Value:({ \
const char* tmp = (str); \
(
xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdup(tmp)}; \
})
struct xroad_str_s xroad_str_t
see common/xroad_string.h for details
Definition: xroad_common_fwd.h:39
allocate new string
◆ xroad_str_alloc_len
#define xroad_str_alloc_len |
( |
|
str, |
|
|
|
len |
|
) |
| |
Value:({ \
uint32_t len_77 = (len); \
const char* tmp = (str); \
(
xroad_str_t){len_77, tmp == NULL ? NULL : strndup(tmp, len_77)}; \
})
allocate new string with len
◆ xroad_str_alloca
#define xroad_str_alloca |
( |
|
str | ) |
|
Value:({ \
const char* tmp = (str); \
(
xroad_str_t){(uint32_t)strlen(tmp), tmp == NULL ? NULL : strdupa(tmp)}; \
})
allocate new string using alloca
◆ xroad_str_cmp
#define xroad_str_cmp |
( |
|
a, |
|
|
|
b |
|
) |
| |
Value:({ \
xroad_str_t tmp_1234599 = (a); \
xroad_str_t tmp_5432199 = (b); \
tmp_1234599.len == tmp_5432199.len ? \
strncmp(tmp_1234599.data, tmp_5432199.data, tmp_1234599.len) : \
(tmp_1234599.len < tmp_5432199.len ? -1 : 1); \
})
compare two strings
- Returns
- the same as for strcmp
◆ xroad_str_concat
#define xroad_str_concat |
( |
|
str1, |
|
|
|
str2 |
|
) |
| |
Value:({ \
xroad_str_t tmp_1234599 = (str1); \
xroad_str_t tmp_5432199 = (str2); \
char* data_1234 = (char*)malloc(tmp_1234599.len + tmp_5432199.len); \
memcpy(data_1234, tmp_1234599.data, tmp_1234599.len); \
memcpy(data_1234 + tmp_1234599.len, tmp_5432199.data, tmp_5432199.len); \
(
xroad_str_t){tmp_1234599.len + tmp_5432199.len, data_1234}; \
})
concatenate two strings
- Parameters
-
[in,out] | str1 | - destination string |
[in] | str2 | - source c-string |
◆ xroad_str_concata
#define xroad_str_concata |
( |
|
str1, |
|
|
|
str2 |
|
) |
| |
Value:({ \
xroad_str_t tmp_1234599 = (str1); \
xroad_str_t tmp_5432199 = (str2); \
char* data_1234 = (char*)alloca(tmp_1234599.len + tmp_5432199.len); \
memcpy(data_1234, tmp_1234599.data, tmp_1234599.len); \
memcpy(data_1234 + tmp_1234599.len, tmp_5432199.data, tmp_5432199.len); \
(
xroad_str_t){tmp_1234599.len + tmp_5432199.len, data_1234}; \
})
concatenate two strings at malloca buffer
- Parameters
-
[in,out] | str1 | - destination string |
[in] | str2 | - source c-string |
◆ xroad_str_decl
#define xroad_str_decl |
( |
|
name, |
|
|
|
sz |
|
) |
| typedef struct { uint32_t len; char data[sz]; } name ## _t; |
creates fixed length string and related methods for string data + 1 byte for zero end char
- Parameters
-
[in] | name | - name of type |
[in] | sz | - maximum string length. |
◆ xroad_str_dup
#define xroad_str_dup |
( |
|
str | ) |
|
Value:({ \
xroad_str_t a = (str); \
(
xroad_str_t){a.len, a.data == NULL ? NULL : strndup(a.data, a.len)}; \
})
duplicates string
◆ xroad_str_dupa
#define xroad_str_dupa |
( |
|
str | ) |
|
Value:({ \
xroad_str_t a = (str); \
(
xroad_str_t){a.len, a.data == NULL ? NULL : strndupa(a.data, a.len)}; \
})
duplicates string using alloca
◆ xroad_str_endwith
#define xroad_str_endwith |
( |
|
a, |
|
|
|
suffix |
|
) |
| |
Value:({ \
xroad_str_t a_1234599 = (a); \
xroad_str_t suffix_5432199 = (suffix); \
bool res = a_1234599.len < suffix_5432199.len; \
if (!res) \
{ \
uint32_t offset = a_1234599.len - suffix_5432199.len; \
res = !strncmp(a_1234599.data + offset, suffix_5432199.data, suffix_5432199.len); \
} \
res; \
}) \
check if string ends with suffix
- Returns
- true or false
◆ xroad_str_fixed_concat
#define xroad_str_fixed_concat |
( |
|
lhs, |
|
|
|
rhs |
|
) |
| |
Value:({ \
__typeof__ (lhs) _lhs = (lhs); \
xroad_str_t _rhs = (rhs); \
memcpy(_lhs->data + _lhs->len, _rhs.data, cat_len_123); \
_lhs->len += cat_len_123; \
cat_len_123; \
})
#define xroad_min(a, b)
Definition: xroad_aux.h:32
#define xroad_str_fixed_size(str)
Definition: xroad_string.h:250
concatenate two fixed length strings
- Parameters
-
[in] | lhs | - pointer to fixed length string |
[in] | rhs | - xroad_str_t |
- Returns
- new fixed length str size
◆ xroad_str_fixed_format
#define xroad_str_fixed_format |
( |
|
str, |
|
|
|
fmt, |
|
|
|
... |
|
) |
| |
Value:({ \
__typeof__ (str) str_123_ = (str); \
if (res_123_ > 0) \
{ \
} \
res_123_; \
})
set fixed length string using format. The same as xroad_str_fixed_vformat
- Parameters
-
[in] | str | - pointer to fixed length string to set |
[in] | fmt | - format (see xroad_format.h for format details) |
- Returns
- length of str after applying format
◆ xroad_str_fixed_set
#define xroad_str_fixed_set |
( |
|
str, |
|
|
|
val |
|
) |
| |
Value:({ \
__typeof__ (str) _str_123 = (str); \
xroad_str_t _val_123 = (val); \
{ \
memcpy(_str_123->data, _val_123.data, _str_123->len); \
} \
_str_123->len; \
})
#define xroad_str_is_null(str)
Definition: xroad_string.h:147
set fixed length string with data
- Parameters
-
[in] | str | - pointer to fixed length string to set |
[in] | val | - pointer to xroad_str_t with value to set |
- Returns
- new length of fixed string
◆ xroad_str_fixed_size
#define xroad_str_fixed_size |
( |
|
str | ) |
sizeof((str)->data) |
returns fixed string size
◆ xroad_str_fixed_to_cstr
#define xroad_str_fixed_to_cstr |
( |
|
str | ) |
|
Value:({ \
__typeof__ (str) tmp_1234599 = (str); \
char* res = NULL; \
if (tmp_1234599) \
{ \
char* tmp_991 = (char*)alloca(tmp_1234599->len + 1); \
tmp_991[tmp_1234599->len] = 0; \
res = (char*)memcpy(tmp_991, tmp_1234599->data, tmp_1234599->len); \
} \
res; \
})
convert fixed length string to c-string. c-string is allocated on stack
- Parameters
-
[in] | str | - pointer to fixed length string |
- Returns
- c-string
◆ xroad_str_fixed_to_upper
#define xroad_str_fixed_to_upper |
( |
|
str | ) |
|
Value:({ \
__typeof__ (str) tmp_1234599 = (str); \
for(uint32_t i = 0; i < tmp_1234599->len; ++i) \
{ \
tmp_1234599->data[i] = toupper(tmp_1234599->data[i]); \
} \
})
convert string to upper case
- Parameters
-
[in] | str | - string to convert |
◆ xroad_str_fixed_vformat
#define xroad_str_fixed_vformat |
( |
|
str, |
|
|
|
fmt, |
|
|
|
ap |
|
) |
| |
Value:({ \
__typeof__ (str) str_123_ = (str); \
if (res_123_ > 0) \
{ \
} \
res_123_; \
})
set fixed length string using format
- Parameters
-
[in] | str | - pointer to fixed length string to set |
[in] | fmt | - format (see xroad_format.h for format details) |
[in] | ap | - list of parameters |
- Returns
- length of str after applying format
◆ xroad_str_free
#define xroad_str_free |
( |
|
str | ) |
|
Value:({ \
free((void*)ptr->data); \
ptr->data = NULL; \
ptr->len = 0; \
})
Definition: xroad_string.h:29
frees string data
◆ xroad_str_from_arr
#define xroad_str_from_arr |
( |
|
arr | ) |
(xroad_str_t){strnlen(arr, sizeof(arr)), arr} |
convert char array to xroad_str_t
◆ xroad_str_from_cstr
#define xroad_str_from_cstr |
( |
|
str | ) |
|
Value: ({ \
char* _s_11_ = (char*)(str); \
(
xroad_str_t){_s_11_ == NULL ? 0 : (uint32_t)strlen(_s_11_), _s_11_}; \
})
convert string to xroad_str_t
◆ xroad_str_from_fixed
#define xroad_str_from_fixed |
( |
|
str | ) |
|
Value:({ \
__typeof__ (str) ptr_6584 = (str); \
})
#define xroad_str_len(str, len)
Definition: xroad_string.h:184
#define xroad_str_null
Definition: xroad_string.h:142
converts fixed length string ptr to xroad_str_t
◆ xroad_str_has
#define xroad_str_has |
( |
|
a, |
|
|
|
subs |
|
) |
| |
Value:({ \
xroad_str_t a_1234599 = (a); \
xroad_str_t subs_5432199 = (subs); \
void* res_1234599 = memmem((void*)a_1234599.data, a_1234599.len, (void*)subs_5432199.data, subs_5432199.len); \
(int64_t)(!res_1234599 ? -1 : ((uint64_t)res_1234599 - (uint64_t)a_1234599.data)); \
})
check if string contains substring (subs)
- Returns
- -1 - string has no subs, else offset of subs placement
◆ xroad_str_is_empty
#define xroad_str_is_empty |
( |
|
str | ) |
|
Value:({ \
xroad_str_t a = (str); \
(a.len == 0 && a.data != NULL); \
})
check if string is empty('')
◆ xroad_str_is_null
#define xroad_str_is_null |
( |
|
str | ) |
|
Value:({ \
xroad_str_t a = (str); \
(a.len == 0 && a.data == NULL); \
})
check if string is null
◆ xroad_str_len
#define xroad_str_len |
( |
|
str, |
|
|
|
len |
|
) |
| |
Value: ({ \
char* _s_11_ = (char*)(str); \
(
xroad_str_t){_s_11_ == NULL ? 0U : (uint32_t)(len), _s_11_}; \
})
create xroad_str_t from str and its length
◆ xroad_str_null
◆ xroad_str_startwith
#define xroad_str_startwith |
( |
|
a, |
|
|
|
prefix |
|
) |
| |
Value:({ \
xroad_str_t a_1234599 = (a); \
xroad_str_t prefix_5432199 = (prefix); \
a_1234599.len < prefix_5432199.len ? false : !strncmp(a_1234599.data, prefix_5432199.data, prefix_5432199.len); \
})
check if string starts with prefix
- Returns
- true or false
◆ xroad_str_to_cstr
#define xroad_str_to_cstr |
( |
|
str | ) |
|
Value:({ \
xroad_str_t _tmp_9023 = (str); \
char* res = (char*)alloca(_tmp_9023.len + 1); \
res[_tmp_9023.len] = '\0'; \
(char*)memcpy(res, _tmp_9023.data, _tmp_9023.len); \
})
convert string to c-string
- Parameters
-
[in] | str | - string to convert |
- Returns
- c-string, must NOT be deallocated to free call
◆ xroad_str_to_lower
#define xroad_str_to_lower |
( |
|
v | ) |
|
Value:({ \
xroad_str_t s = (v); \
char* buf = alloca(s.len); \
for(int32_t i = 0;i < s.len; ++i) \
{ \
buf[i] = tolower(s.data[i]); \
} \
})
converts string to lower case
◆ xroad_str_to_sql
#define xroad_str_to_sql |
( |
|
v | ) |
|
Value:({ \
xroad_str_t s = (v); \
char* buf = "NULL"; \
uint32_t len = 4; \
{ \
buf = alloca(s.len * 2 + 2); \
char* it = buf; \
*it = '\''; \
++it; \
len = 1; \
for (int32_t i = 0; i < s.len; ++i) \
{ \
if (s.data[i] == '\'') \
{ \
*it = '\''; \
++it; \
len += 1; \
} \
*it = s.data[i]; \
++it; \
len += 1; \
} \
*it = '\''; \
len += 1; \
} \
xroad_str_len(buf, len); \
})
convert string to SQL representation (NULL, 'string ''value') with escaping
- Parameters
-
[in] | v | - xroad_str_t to convert |
- Returns
- xroad_str_t SQL string