Blender V4.5
BLI_string_utf8.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include "BLI_compiler_attrs.h"
12#include "BLI_sys_types.h"
13
14char *BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy)
15 ATTR_NONNULL(1, 2);
16size_t BLI_strncpy_utf8_rlen(char *__restrict dst,
17 const char *__restrict src,
18 size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
23size_t BLI_strncpy_utf8_rlen_unterminated(char *__restrict dst,
24 const char *__restrict src,
25 size_t dst_maxncpy);
26
32ptrdiff_t BLI_str_utf8_invalid_byte(const char *str, size_t str_len) ATTR_NONNULL(1);
40int BLI_str_utf8_invalid_strip(char *str, size_t str_len) ATTR_NONNULL(1);
49int BLI_str_utf8_invalid_substitute(char *str, size_t str_len, const char substitute)
50 ATTR_NONNULL(1);
51
61 const char *str, size_t str_len, const char substitute, char *buf, const size_t buf_maxncpy)
62 ATTR_NONNULL(1, 4);
63
85 ATTR_NONNULL(1);
96unsigned int BLI_str_utf8_as_unicode_step_safe(const char *__restrict p,
97 size_t p_len,
98 size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
99 ATTR_NONNULL(1, 3);
114 const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
115 ATTR_NONNULL(1, 3);
116
130size_t BLI_str_utf8_from_unicode(unsigned int c, char *dst, size_t dst_maxncpy) ATTR_NONNULL(2);
131size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w,
132 const char *__restrict src_c,
133 size_t dst_w_maxncpy) ATTR_NONNULL(1, 2);
134size_t BLI_str_utf32_as_utf8(char *__restrict dst,
135 const char32_t *__restrict src,
136 size_t dst_maxncpy) ATTR_NONNULL(1, 2);
140size_t BLI_str_utf32_as_utf8_len_ex(const char32_t *src, size_t src_maxlen) ATTR_WARN_UNUSED_RESULT
141 ATTR_NONNULL(1);
146
162const char *BLI_str_find_prev_char_utf8(const char *p, const char *str_start)
176const char *BLI_str_find_next_char_utf8(const char *p, const char *str_end)
178
182size_t BLI_wstrlen_utf8(const wchar_t *src) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
183size_t BLI_strlen_utf8_ex(const char *strc, size_t *r_len_bytes)
185size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
186size_t BLI_strnlen_utf8_ex(const char *strc, size_t strc_maxlen, size_t *r_len_bytes)
187 ATTR_NONNULL(1, 3);
193size_t BLI_strnlen_utf8(const char *strc, size_t strc_maxlen)
195size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst,
196 const wchar_t *__restrict src,
197 size_t dst_maxncpy) ATTR_NONNULL(1, 2);
198size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w,
199 const char *__restrict src_c,
200 size_t dst_w_maxncpy) ATTR_NONNULL(1, 2);
201
207int BLI_wcswidth_or_error(const char32_t *pwcs, size_t n) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
208
214char32_t BLI_str_utf32_char_to_upper(char32_t wc);
220char32_t BLI_str_utf32_char_to_lower(char32_t wc);
221
222bool BLI_str_utf32_char_is_breaking_space(char32_t codepoint);
223bool BLI_str_utf32_char_is_optional_break_after(char32_t codepoint, char32_t codepoint_prev);
224bool BLI_str_utf32_char_is_optional_break_before(char32_t codepoint, char32_t codepoint_prev);
225
231
232size_t BLI_str_partition_utf8(const char *str,
233 const unsigned int delim[],
234 const char **r_sep,
235 const char **r_suf) ATTR_NONNULL(1, 2, 3, 4);
236size_t BLI_str_rpartition_utf8(const char *str,
237 const unsigned int delim[],
238 const char **r_sep,
239 const char **r_suf) ATTR_NONNULL(1, 2, 3, 4);
241 const char *end,
242 const unsigned int delim[],
243 const char **r_sep,
244 const char **r_suf,
245 bool from_right) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 3, 4, 5);
246
253bool BLI_str_utf8_truncate_at_size(char *str, const size_t str_size);
254
255int BLI_str_utf8_offset_to_index(const char *str,
256 size_t str_len,
257 int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
264int BLI_str_utf8_offset_from_index(const char *str,
265 size_t str_len,
266 int index_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
267int BLI_str_utf8_offset_to_column(const char *str,
268 size_t str_len,
269 int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
271 size_t str_len,
272 int column_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
274 size_t str_len,
275 int offset_target,
276 int tab_width) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
278 size_t str_len,
279 int column_target,
280 int tab_width) ATTR_WARN_UNUSED_RESULT
281 ATTR_NONNULL(1);
282
284#define BLI_UTF8_MAX 6
285#define BLI_UTF8_WIDTH_MAX 2 /* columns */
286#define BLI_UTF8_ERR ((unsigned int)-1)
287
288/* -------------------------------------------------------------------- */
293
294#define STRNCPY_UTF8(dst, src) BLI_strncpy_utf8(dst, src, ARRAY_SIZE(dst))
295#define STRNCPY_UTF8_RLEN(dst, src) BLI_strncpy_utf8_rlen(dst, src, ARRAY_SIZE(dst))
296
297#define STRNLEN_UTF8(str) BLI_strnlen_utf8(str, ARRAY_SIZE(str))
298
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_RETURNS_NONNULL
#define ATTR_NONNULL(...)
bool BLI_str_utf32_char_is_breaking_space(char32_t codepoint)
size_t size_t size_t BLI_str_utf32_as_utf8_len_ex(const char32_t *src, size_t src_maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
const char const char * BLI_str_find_next_char_utf8(const char *p, const char *str_end) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1
size_t BLI_str_utf32_as_utf8_len(const char32_t *src) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
bool BLI_str_utf32_char_is_optional_break_before(char32_t codepoint, char32_t codepoint_prev)
char32_t BLI_str_utf32_char_to_lower(char32_t wc)
int BLI_str_utf8_offset_from_index(const char *str, size_t str_len, int index_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_str_utf8_char_width_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t size_t size_t bool BLI_str_utf8_truncate_at_size(char *str, const size_t str_size)
const char * BLI_str_utf8_invalid_substitute_as_needed(const char *str, size_t str_len, const char substitute, char *buf, const size_t buf_maxncpy) ATTR_NONNULL(1
size_t size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w, const char *__restrict src_c, size_t dst_w_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t size_t BLI_str_rpartition_utf8(const char *str, const unsigned int delim[], const char **r_sep, const char **r_suf) ATTR_NONNULL(1
int BLI_str_utf8_invalid_substitute(char *str, size_t str_len, const char substitute) ATTR_NONNULL(1)
int BLI_str_utf8_char_width_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
ptrdiff_t BLI_str_utf8_invalid_byte(const char *str, size_t str_len) ATTR_NONNULL(1)
size_t size_t BLI_strnlen_utf8(const char *strc, size_t strc_maxlen) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
int BLI_str_utf8_size_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_str_partition_utf8(const char *str, const unsigned int delim[], const char **r_sep, const char **r_suf) ATTR_NONNULL(1
unsigned int unsigned int BLI_str_utf8_as_unicode_step_or_error(const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int BLI_wcswidth_or_error(const char32_t *pwcs, size_t n) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_str_utf8_offset_to_index(const char *str, size_t str_len, int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
const char * BLI_str_find_prev_char_utf8(const char *p, const char *str_start) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1
size_t size_t int BLI_wcwidth_or_error(char32_t ucs) ATTR_WARN_UNUSED_RESULT
unsigned int BLI_str_utf8_as_unicode_step_safe(const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char size_t BLI_strncpy_utf8_rlen(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int BLI_str_utf8_offset_from_column(const char *str, size_t str_len, int column_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_strnlen_utf8_ex(const char *strc, size_t strc_maxlen, size_t *r_len_bytes) ATTR_NONNULL(1
char size_t size_t BLI_strncpy_utf8_rlen_unterminated(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy)
size_t size_t BLI_str_utf32_as_utf8(char *__restrict dst, const char32_t *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
const char const char size_t BLI_wstrlen_utf8(const wchar_t *src) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
char32_t BLI_str_utf32_char_to_upper(char32_t wc)
size_t size_t size_t BLI_str_partition_ex_utf8(const char *str, const char *end, const unsigned int delim[], const char **r_sep, const char **r_suf, bool from_right) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
bool BLI_str_utf32_char_is_optional_break_after(char32_t codepoint, char32_t codepoint_prev)
int BLI_str_utf8_invalid_strip(char *str, size_t str_len) ATTR_NONNULL(1)
size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w, const char *__restrict src_c, size_t dst_w_maxncpy) ATTR_NONNULL(1
unsigned int unsigned int size_t BLI_str_utf8_from_unicode_len(unsigned int c) ATTR_WARN_UNUSED_RESULT
int BLI_str_utf8_offset_to_column(const char *str, size_t str_len, int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, const wchar_t *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t BLI_str_utf8_from_unicode(unsigned int c, char *dst, size_t dst_maxncpy) ATTR_NONNULL(2)
const char int BLI_str_utf8_size_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
unsigned int BLI_str_utf8_as_unicode_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_strlen_utf8_ex(const char *strc, size_t *r_len_bytes) ATTR_NONNULL(1
int BLI_wcwidth_safe(char32_t ucs) ATTR_WARN_UNUSED_RESULT
int BLI_str_utf8_offset_from_column_with_tabs(const char *str, size_t str_len, int column_target, int tab_width) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
unsigned int BLI_str_utf8_as_unicode_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_str_utf8_offset_to_column_with_tabs(const char *str, size_t str_len, int offset_target, int tab_width) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define str(s)