FD.io VPP
v20.09-64-g4f7b92f0a
Vector Packet Processing
|
Optimized string handling code, including c11-compliant "safe C library" variants. More...
Go to the source code of this file.
Macros | |
#define | clib_memcpy_fast(a, b, c) memcpy(a,b,c) |
#define | EINVAL 22 |
#define | ESRCH 3 |
#define | EOVERFLOW 75 |
#define | CLIB_STRING_MACRO_MAX 4096 |
#define | clib_memcpy(d, s, n) memcpy_s_inline(d,n,s,n) |
#define | clib_memset(s, c, n) memset_s_inline(s,n,c,n) |
#define | clib_memcmp(s1, s2, m1) |
#define | clib_strnlen(s, m) strnlen_s_inline(s,m) |
#define | clib_strcmp(s1, s2) |
#define | clib_strncmp(s1, s2, n) |
#define | clib_strcpy(d, s) strcpy_s_inline(d,CLIB_STRING_MACRO_MAX,s) |
#define | clib_strncpy(d, s, n) strncpy_s_inline(d,CLIB_STRING_MACRO_MAX,s,n) |
#define | clib_strcat(d, s) strcat_s_inline(d,CLIB_STRING_MACRO_MAX,s) |
#define | clib_strncat(d, s, n) strncat_s_inline(d,CLIB_STRING_MACRO_MAX,s,n) |
#define | clib_strtok(s1, s2, p) |
#define | STRTOK_DELIM_MAX_LEN 16 |
#define | clib_strstr(s1, s2) |
Typedefs | |
typedef int | errno_t |
typedef uword | rsize_t |
Functions | |
void | clib_memswap (void *_a, void *_b, uword bytes) |
void | clib_c11_violation (const char *s) |
errno_t | memcpy_s (void *__restrict__ dest, rsize_t dmax, const void *__restrict__ src, rsize_t n) |
copy src to dest, at most n bytes, up to dmax More... | |
static errno_t | memcpy_s_inline (void *__restrict__ dest, rsize_t dmax, const void *__restrict__ src, rsize_t n) |
errno_t | memset_s (void *s, rsize_t smax, int c, rsize_t n) |
set n bytes starting at s to the specified c value More... | |
static errno_t | memset_s_inline (void *s, rsize_t smax, int c, rsize_t n) |
static_always_inline void | clib_memcpy_le (u8 *dst, u8 *src, u8 len, u8 max_len) |
static_always_inline void | clib_memcpy_le64 (u8 *dst, u8 *src, u8 len) |
static_always_inline void | clib_memcpy_le32 (u8 *dst, u8 *src, u8 len) |
static_always_inline void | clib_memset_u64 (void *p, u64 val, uword count) |
static_always_inline void | clib_memset_u32 (void *p, u32 val, uword count) |
static_always_inline void | clib_memset_u16 (void *p, u16 val, uword count) |
static_always_inline void | clib_memset_u8 (void *p, u8 val, uword count) |
static_always_inline uword | clib_count_equal_u64 (u64 *data, uword max_count) |
static_always_inline uword | clib_count_equal_u32 (u32 *data, uword max_count) |
static_always_inline uword | clib_count_equal_u16 (u16 *data, uword max_count) |
static_always_inline uword | clib_count_equal_u8 (u8 *data, uword max_count) |
errno_t | memcmp_s (const void *s1, rsize_t s1max, const void *s2, rsize_t s2max, int *diff) |
compare memory until they differ, and their difference is returned in diff More... | |
static errno_t | memcmp_s_inline (const void *s1, rsize_t s1max, const void *s2, rsize_t s2max, int *diff) |
size_t | strnlen_s (const char *s, size_t maxsize) |
compute the length in s, no more than maxsize More... | |
static size_t | strnlen_s_inline (const char *s, size_t maxsize) |
errno_t | strcmp_s (const char *s1, rsize_t s1max, const char *s2, int *indicator) |
compare string s2 to string s1, and their difference is returned in indicator More... | |
static errno_t | strcmp_s_inline (const char *s1, rsize_t s1max, const char *s2, int *indicator) |
errno_t | strncmp_s (const char *s1, rsize_t s1max, const char *s2, rsize_t n, int *indicator) |
compare string s2 to string s1, no more than n characters, and their difference is returned in indicator More... | |
static errno_t | strncmp_s_inline (const char *s1, rsize_t s1max, const char *s2, rsize_t n, int *indicator) |
errno_t | strcpy_s (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src) |
copy src string to dest string More... | |
static errno_t | strcpy_s_inline (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src) |
errno_t | strncpy_s (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src, rsize_t n) |
copy src string to dest string, no more than n characters More... | |
static errno_t | strncpy_s_inline (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src, rsize_t n) |
errno_t | strcat_s (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src) |
append src string to dest string, including null More... | |
static errno_t | strcat_s_inline (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src) |
errno_t | strncat_s (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src, rsize_t n) |
append src string to dest string, including null, no more than n characters More... | |
static errno_t | strncat_s_inline (char *__restrict__ dest, rsize_t dmax, const char *__restrict__ src, rsize_t n) |
char * | strtok_s (char *__restrict__ s1, rsize_t *__restrict__ s1max, const char *__restrict__ s2, char **__restrict__ ptr) |
tokenize string s1 with delimiter specified in s2. More... | |
static char * | strtok_s_inline (char *__restrict__ s1, rsize_t *__restrict__ s1max, const char *__restrict__ s2, char **__restrict__ ptr) |
errno_t | strstr_s (char *s1, rsize_t s1max, const char *s2, rsize_t s2max, char **substring) |
locate the first occurrence of the substring s2 in s1 More... | |
static errno_t | strstr_s_inline (char *s1, rsize_t s1max, const char *s2, rsize_t s2max, char **substring) |
Optimized string handling code, including c11-compliant "safe C library" variants.
Definition in file string.h.
#define clib_memcmp | ( | s1, | |
s2, | |||
m1 | |||
) |
#define clib_memcpy | ( | d, | |
s, | |||
n | |||
) | memcpy_s_inline(d,n,s,n) |
#define clib_memset | ( | s, | |
c, | |||
n | |||
) | memset_s_inline(s,n,c,n) |
#define clib_strcat | ( | d, | |
s | |||
) | strcat_s_inline(d,CLIB_STRING_MACRO_MAX,s) |
#define clib_strcmp | ( | s1, | |
s2 | |||
) |
#define clib_strcpy | ( | d, | |
s | |||
) | strcpy_s_inline(d,CLIB_STRING_MACRO_MAX,s) |
#define clib_strncat | ( | d, | |
s, | |||
n | |||
) | strncat_s_inline(d,CLIB_STRING_MACRO_MAX,s,n) |
#define clib_strncmp | ( | s1, | |
s2, | |||
n | |||
) |
#define clib_strncpy | ( | d, | |
s, | |||
n | |||
) | strncpy_s_inline(d,CLIB_STRING_MACRO_MAX,s,n) |
#define clib_strnlen | ( | s, | |
m | |||
) | strnlen_s_inline(s,m) |
#define clib_strstr | ( | s1, | |
s2 | |||
) |
#define clib_strtok | ( | s1, | |
s2, | |||
p | |||
) |
#define STRTOK_DELIM_MAX_LEN 16 |
void clib_c11_violation | ( | const char * | s | ) |
static_always_inline uword clib_count_equal_u16 | ( | u16 * | data, |
uword | max_count | ||
) |
static_always_inline uword clib_count_equal_u32 | ( | u32 * | data, |
uword | max_count | ||
) |
static_always_inline uword clib_count_equal_u64 | ( | u64 * | data, |
uword | max_count | ||
) |
static_always_inline uword clib_count_equal_u8 | ( | u8 * | data, |
uword | max_count | ||
) |
static_always_inline void clib_memcpy_le | ( | u8 * | dst, |
u8 * | src, | ||
u8 | len, | ||
u8 | max_len | ||
) |
static_always_inline void clib_memcpy_le32 | ( | u8 * | dst, |
u8 * | src, | ||
u8 | len | ||
) |
static_always_inline void clib_memcpy_le64 | ( | u8 * | dst, |
u8 * | src, | ||
u8 | len | ||
) |
static_always_inline void clib_memset_u16 | ( | void * | p, |
u16 | val, | ||
uword | count | ||
) |
static_always_inline void clib_memset_u32 | ( | void * | p, |
u32 | val, | ||
uword | count | ||
) |
static_always_inline void clib_memset_u64 | ( | void * | p, |
u64 | val, | ||
uword | count | ||
) |
static_always_inline void clib_memset_u8 | ( | void * | p, |
u8 | val, | ||
uword | count | ||
) |
void clib_memswap | ( | void * | _a, |
void * | _b, | ||
uword | bytes | ||
) |
compare memory until they differ, and their difference is returned in diff
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s1 | pointer to memory to compare against |
s1max | maximum length of s1 |
*s2 | pointer to memory to compare with s1 |
s2max | length of s2 |
*diff | pointer to the diff which is an integer greater than, equal to, or less than zero according to s1 is greater than, equal to, or less than s2. |
No null pointers s1max and s2max shall not be zero s2max shall not be greater than s1max
Definition at line 178 of file string.c.
copy src to dest, at most n bytes, up to dmax
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*dest | pointer to memory to copy to |
dmax | maximum length of resulting dest |
*src | pointer to memory to copy from |
n | maximum number of characters to copy from src |
No null pointers n shall not be greater than dmax no memory overlap between src and dest
Definition at line 120 of file string.c.
set n bytes starting at s to the specified c value
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s | pointer to memory to set the c value |
smax | maximum length of resulting s |
c | byte value |
n | maximum number of characters to set in s |
No null pointers n shall not be greater than smax
Definition at line 145 of file string.c.
append src string to dest string, including null
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*dest | pointer to string to append to |
dmax | maximum length of resulting dest string, including null |
*src | pointer to string to append from |
No null pointers dmax shall not be zero dest shall be null terminated given m = dmax - strnlen (dest, dmax) n = strnlen (src, m) n shall not be >= m no memory overlap between src and dest
Definition at line 328 of file string.c.
compare string s2 to string s1, and their difference is returned in indicator
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s1 | pointer to string to compare against |
s1max | maximum length of s1, excluding null |
*s2 | pointer to string to compare with s1 |
*indicator | pointer to the comparison result, which is an integer greater than, equal to, or less than zero according to s1 is greater than, equal to, or less than s2. |
No null pointers s1max shall not be zero s1 shall be null terminated n shall not be greater than the smaller of s1max and strlen of s1
Definition at line 213 of file string.c.
copy src string to dest string
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*dest | pointer to string to copy to |
dmax | maximum length of resulting dest string, including null |
*src | pointer to string to copy from |
No null pointers dmax shall not be zero dmax shall be greater than string length of src no memory overlap between src and dest
Definition at line 272 of file string.c.
errno_t strncat_s | ( | char *__restrict__ | dest, |
rsize_t | dmax, | ||
const char *__restrict__ | src, | ||
rsize_t | n | ||
) |
append src string to dest string, including null, no more than n characters
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*dest | pointer to string to append to |
dmax | maximum length of resulting dest string, including null |
*src | pointer to string to append from |
n | maximum characters to append (excluding null) |
No null pointers dmax shall not be zero dest shall be null terminated dmax - strnlen (dest, dmax) shall not be zero no memory overlap between src and dest
Definition at line 358 of file string.c.
compare string s2 to string s1, no more than n characters, and their difference is returned in indicator
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s1 | pointer to string to compare against |
s1max | maximum length of s1, excluding null |
*s2 | pointer to string to compare with s1 |
n | maximum number of characters to compare |
*indicator | pointer to the comparison result, which is an integer greater than, equal to, or less than zero according to s1 is greater than, equal to, or less than s2. |
No null pointers s1max shall not be zero s1 shall be null terminated
Definition at line 246 of file string.c.
errno_t strncpy_s | ( | char *__restrict__ | dest, |
rsize_t | dmax, | ||
const char *__restrict__ | src, | ||
rsize_t | n | ||
) |
copy src string to dest string, no more than n characters
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*dest | pointer to string to copy to |
dmax | maximum length of resulting dest string, including null |
*src | pointer to string to copy from |
n | maximum number of characters to copy from src, excluding null |
No null pointers dmax shall not be zero no memory overlap between src and dest
Definition at line 299 of file string.c.
size_t strnlen_s | ( | const char * | s, |
size_t | maxsize | ||
) |
compute the length in s, no more than maxsize
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s | pointer to string |
maxsize | restricted maximum length |
No null pointers maxsize shall not be zero
Definition at line 433 of file string.c.
|
inlinestatic |
locate the first occurrence of the substring s2 in s1
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s1 | pointer to string to be searched for substring |
s1max | restricted maximum length of s1 |
*s2 | pointer to substring to search |
s2max | restricted maximum length of s2 |
**substring | pointer to pointer substring to be returned |
No null pointers s1max and s2max shall not be zero s1 and s2 shall be null terminated
Example: char *sub = 0; char *s1 = "success is not final, failure is not fatal.";
strstr_s (s1, strlen (s1), "failure", strlen ("failure"), &sub);
After the above call, sub = "failure is not fatal."
Definition at line 470 of file string.c.
char* strtok_s | ( | char *__restrict__ | s1, |
rsize_t *__restrict__ | s1max, | ||
const char *__restrict__ | s2, | ||
char **__restrict__ | ptr | ||
) |
tokenize string s1 with delimiter specified in s2.
This is a stateful API when it is iterately called, it returns the next token from s1 which is delimited by s2. s1max and ptr maintain the stateful information for the same caller and must not be altered by the caller during the iteration for the correct result
ISO/IEC 9899:2017(C11), Porgramming languages – C Annex K; Bounds-checking interfaces
*s1 | pointer to string to be searched for substring |
*s1max | restricted maximum length of s1 |
*s2 | pointer to substring to search (16 characters max, including null) |
**ptr | in/out pointer which maintains the stateful information |
s2, s1max, and ptr shall not be null if s1 is null, contents of ptr shall not be null s1 and s2 shall be null terminated
Example: char *str2 = " "; char str1[100]; uword len; char *p2str = 0; char *tok1, *tok2, *tok3, *tok4, *tok5, *tok6, *tok7;
strncpy (str1, "brevity is the soul of wit", sizeof (str1)); len = strlen (str1); tok1 = strtok_s (str1, &len, str2, &p2str); tok2 = strtok_s (0, &len, str2, &p2str); tok3 = strtok_s (0, &len, str2, &p2str); tok4 = strtok_s (0, &len, str2, &p2str); tok5 = strtok_s (0, &len, str2, &p2str); tok6 = strtok_s (0, &len, str2, &p2str); tok7 = strtok_s (0, &len, str2, &p2str);
After the above series of calls, tok1 = "brevity", tok2 = "is", tok3 = "the", tok4 = "soul", tok5 = "of", tok6 = "wit", tok7 = null
Definition at line 410 of file string.c.