Feature #28 ยป 0017-fc_utf8.c-Drop-asserts-of-parameters-with-nonnull-at.patch
utility/fc_utf8.c | ||
---|---|---|
****************************************************************************/
|
||
bool fc_utf8_char_validate(const char *utf8_char)
|
||
{
|
||
fc_assert_ret_val(NULL != utf8_char, FALSE);
|
||
return base_fc_utf8_char_validate(utf8_char, FC_UTF8_CHAR_SIZE(utf8_char));
|
||
}
|
||
... | ... | |
****************************************************************************/
|
||
const char *fc_utf8_find_next_char(const char *utf8_char)
|
||
{
|
||
fc_assert_ret_val(NULL != utf8_char, NULL);
|
||
do {
|
||
utf8_char++;
|
||
} while (0 == FC_UTF8_CHAR_SIZE(utf8_char));
|
||
... | ... | |
const char *fc_utf8_find_prev_char(const char *utf8_char,
|
||
const char *utf8_string)
|
||
{
|
||
fc_assert_ret_val(NULL != utf8_char, NULL);
|
||
for (utf8_char--; utf8_char > utf8_string; utf8_char--) {
|
||
if (0 != FC_UTF8_CHAR_SIZE(utf8_char)) {
|
||
return utf8_char;
|
||
... | ... | |
{
|
||
char size;
|
||
fc_assert_ret_val(NULL != utf8_string, FALSE);
|
||
while ('\0' != *utf8_string) {
|
||
size = FC_UTF8_CHAR_SIZE(utf8_string);
|
||
if (!base_fc_utf8_char_validate(utf8_string, size)) {
|
||
... | ... | |
if (NULL != end) {
|
||
*end = utf8_string;
|
||
}
|
||
return TRUE;
|
||
}
|
||
... | ... | |
{
|
||
unsigned char size;
|
||
fc_assert_ret_val(NULL != utf8_string, FALSE);
|
||
while ('\0' != *utf8_string) {
|
||
size = FC_UTF8_CHAR_SIZE(utf8_string);
|
||
if (!base_fc_utf8_char_validate(utf8_string, size)) {
|
||
if (NULL != end) {
|
||
if (end != NULL) {
|
||
*end = utf8_string;
|
||
}
|
||
return FALSE;
|
||
}
|
||
if (size > byte_len) {
|
||
if (NULL != end) {
|
||
if (end != NULL) {
|
||
*end = utf8_string;
|
||
}
|
||
return FALSE;
|
||
... | ... | |
utf8_string += size;
|
||
}
|
||
if (NULL != end) {
|
||
if (end != NULL) {
|
||
*end = utf8_string;
|
||
}
|
||
... | ... | |
{
|
||
char *end;
|
||
fc_assert_ret_val(NULL != utf8_string, NULL);
|
||
if (!fc_utf8_validate(utf8_string, (const char **) &end)) {
|
||
*end = '\0';
|
||
}
|
||
... | ... | |
{
|
||
char *end;
|
||
fc_assert_ret_val(NULL != utf8_string, NULL);
|
||
if (!fc_utf8_validate_len(utf8_string, byte_len, (const char **) &end)) {
|
||
*end = '\0';
|
||
}
|
||
return utf8_string;
|
||
}
|
||
... | ... | |
size_t size;
|
||
char *ret;
|
||
fc_assert_ret_val(NULL != utf8_string, NULL);
|
||
(void) fc_utf8_validate(utf8_string, &end);
|
||
size = end - utf8_string;
|
||
ret = fc_malloc(size + 1); /* Keep a spot for '\0'. */
|
||
... | ... | |
****************************************************************************/
|
||
char *fc_utf8_validate_rep_len(char *utf8_string, size_t byte_len)
|
||
{
|
||
fc_assert_ret_val(NULL != utf8_string, NULL);
|
||
if (0 < byte_len) {
|
||
char copy[byte_len];
|
||
fc_strlcpy(copy, utf8_string, byte_len);
|
||
base_fc_utf8_strlcpy_rep(utf8_string, copy, byte_len);
|
||
}
|
||
return utf8_string;
|
||
}
|
||
... | ... | |
size_t size = 1; /* '\0'. */
|
||
char char_size;
|
||
fc_assert_ret_val(NULL != utf8_string, NULL);
|
||
/* Check needed size. */
|
||
utf8_char = utf8_string;
|
||
while ('\0' != *utf8_char) {
|
||
... | ... | |
{
|
||
size_t len;
|
||
fc_assert_ret_val(NULL != utf8_string, 0);
|
||
for (len = 0; '\0' != *utf8_string; len++) {
|
||
utf8_string = fc_ut8_next_char(utf8_string);
|
||
}
|
||
return len;
|
||
}
|
||
/************************************************************************//**
|
||
This is a variant of fc_strlcpy() to ensure the result will be a valid
|
||
UTF-8 string. It truncates the string at the first UTF-8 invalid
|
||
... | ... | |
****************************************************************************/
|
||
size_t fc_utf8_strlcpy_trunc(char *dest, const char *src, size_t n)
|
||
{
|
||
fc_assert_ret_val(NULL != dest, -1);
|
||
fc_assert_ret_val(NULL != src, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
return base_fc_utf8_strlcpy_trunc(dest, src, n);
|
||
... | ... | |
****************************************************************************/
|
||
size_t fc_utf8_strlcpy_rep(char *dest, const char *src, size_t n)
|
||
{
|
||
fc_assert_ret_val(NULL != dest, -1);
|
||
fc_assert_ret_val(NULL != src, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
return base_fc_utf8_strlcpy_rep(dest, src, n);
|
||
... | ... | |
{
|
||
size_t len;
|
||
fc_assert_ret_val(NULL != dest, -1);
|
||
fc_assert_ret_val(NULL != src, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
len = strlen(dest);
|
||
fc_assert_ret_val(len < n, -1);
|
||
return len + base_fc_utf8_strlcpy_trunc(dest + len, src, n - len);
|
||
}
|
||
... | ... | |
{
|
||
size_t len;
|
||
fc_assert_ret_val(NULL != dest, -1);
|
||
fc_assert_ret_val(NULL != src, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
len = strlen(dest);
|
||
fc_assert_ret_val(len < n, -1);
|
||
return len + base_fc_utf8_strlcpy_rep(dest + len, src, n - len);
|
||
}
|
||
... | ... | |
va_start(args, format);
|
||
ret = fc_utf8_vsnprintf_trunc(str, n, format, args);
|
||
va_end(args);
|
||
return ret;
|
||
}
|
||
... | ... | |
char *end;
|
||
int ret;
|
||
fc_assert_ret_val(NULL != str, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
fc_assert_ret_val(NULL != format, -1);
|
||
ret = fc_vsnprintf(str, n, format, args);
|
||
if (fc_utf8_validate(str, (const char **) &end)) {
|
||
... | ... | |
char *end;
|
||
int ret;
|
||
fc_assert_ret_val(NULL != str, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
fc_assert_ret_val(NULL != format, -1);
|
||
ret = fc_vsnprintf(str, n, format, args);
|
||
if (fc_utf8_validate(str, (const char **) &end)) {
|
||
... | ... | |
int ret;
|
||
va_list args;
|
||
fc_assert_ret_val(NULL != format, -1);
|
||
fc_assert_ret_val(NULL != str, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
len = strlen(str);
|
||
... | ... | |
int ret;
|
||
va_list args;
|
||
fc_assert_ret_val(NULL != format, -1);
|
||
fc_assert_ret_val(NULL != str, -1);
|
||
fc_assert_ret_val(0 < n, -1);
|
||
len = strlen(str);
|