Blender V5.0
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 <stdarg.h>
12
13#include "BLI_compiler_attrs.h"
14#include "BLI_sys_types.h"
15
16char *BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy)
17 ATTR_NONNULL(1, 2);
18size_t BLI_strncpy_utf8_rlen(char *__restrict dst,
19 const char *__restrict src,
20 size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
25size_t BLI_strncpy_utf8_rlen_unterminated(char *__restrict dst,
26 const char *__restrict src,
27 size_t dst_maxncpy);
28
34ptrdiff_t BLI_str_utf8_invalid_byte(const char *str, size_t str_len) ATTR_NONNULL(1);
42int BLI_str_utf8_invalid_strip(char *str, size_t str_len) ATTR_NONNULL(1);
51int BLI_str_utf8_invalid_substitute(char *str, size_t str_len, const char substitute)
52 ATTR_NONNULL(1);
53
63 const char *str, size_t str_len, const char substitute, char *buf, const size_t buf_maxncpy)
64 ATTR_NONNULL(1, 4);
65
87 ATTR_NONNULL(1);
98unsigned int BLI_str_utf8_as_unicode_step_safe(const char *__restrict p,
99 size_t p_len,
100 size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
101 ATTR_NONNULL(1, 3);
116 const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
117 ATTR_NONNULL(1, 3);
118
132size_t BLI_str_utf8_from_unicode(unsigned int c, char *dst, size_t dst_maxncpy) ATTR_NONNULL(2);
133size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w,
134 const char *__restrict src_c,
135 size_t dst_w_maxncpy) ATTR_NONNULL(1, 2);
136size_t BLI_str_utf32_as_utf8(char *__restrict dst,
137 const char32_t *__restrict src,
138 size_t dst_maxncpy) ATTR_NONNULL(1, 2);
142size_t BLI_str_utf32_as_utf8_len_ex(const char32_t *src, size_t src_maxlen) ATTR_WARN_UNUSED_RESULT
143 ATTR_NONNULL(1);
148
164const char *BLI_str_find_prev_char_utf8(const char *p, const char *str_start)
178const char *BLI_str_find_next_char_utf8(const char *p, const char *str_end)
180
184size_t BLI_wstrlen_utf8(const wchar_t *src) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
185size_t BLI_strlen_utf8_ex(const char *strc, size_t *r_len_bytes)
187size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
188size_t BLI_strnlen_utf8_ex(const char *strc, size_t strc_maxlen, size_t *r_len_bytes)
189 ATTR_NONNULL(1, 3);
195size_t BLI_strnlen_utf8(const char *strc, size_t strc_maxlen)
197size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst,
198 const wchar_t *__restrict src,
199 size_t dst_maxncpy) ATTR_NONNULL(1, 2);
200size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w,
201 const char *__restrict src_c,
202 size_t dst_w_maxncpy) ATTR_NONNULL(1, 2);
203
207size_t BLI_snprintf_utf8(char *__restrict dst,
208 size_t dst_maxncpy,
209 const char *__restrict format,
216size_t BLI_snprintf_utf8_rlen(char *__restrict dst,
217 size_t dst_maxncpy,
218 const char *__restrict format,
219 ...) ATTR_NONNULL(1, 3) ATTR_PRINTF_FORMAT(3, 4);
220
224size_t BLI_vsnprintf_utf8(char *__restrict dst,
225 size_t dst_maxncpy,
226 const char *__restrict format,
227 va_list arg) ATTR_PRINTF_FORMAT(3, 0);
232size_t BLI_vsnprintf_utf8_rlen(char *__restrict dst,
233 size_t dst_maxncpy,
234 const char *__restrict format,
235 va_list arg) ATTR_PRINTF_FORMAT(3, 0);
236
242int BLI_wcswidth_or_error(const char32_t *pwcs, size_t n) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
243
249char32_t BLI_str_utf32_char_to_upper(char32_t wc);
255char32_t BLI_str_utf32_char_to_lower(char32_t wc);
256
257bool BLI_str_utf32_char_is_breaking_space(char32_t codepoint);
258bool BLI_str_utf32_char_is_optional_break_after(char32_t codepoint, char32_t codepoint_prev);
259bool BLI_str_utf32_char_is_optional_break_before(char32_t codepoint, char32_t codepoint_prev);
260
266
267size_t BLI_str_partition_utf8(const char *str,
268 const unsigned int delim[],
269 const char **r_sep,
270 const char **r_suf) ATTR_NONNULL(1, 2, 3, 4);
271size_t BLI_str_rpartition_utf8(const char *str,
272 const unsigned int delim[],
273 const char **r_sep,
274 const char **r_suf) ATTR_NONNULL(1, 2, 3, 4);
276 const char *end,
277 const unsigned int delim[],
278 const char **r_sep,
279 const char **r_suf,
280 bool from_right) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 3, 4, 5);
281
288bool BLI_str_utf8_truncate_at_size(char *str, const size_t str_size);
289
290int BLI_str_utf8_offset_to_index(const char *str,
291 size_t str_len,
292 int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
299int BLI_str_utf8_offset_from_index(const char *str,
300 size_t str_len,
301 int index_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
302int BLI_str_utf8_offset_to_column(const char *str,
303 size_t str_len,
304 int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
306 size_t str_len,
307 int column_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
309 size_t str_len,
310 int offset_target,
311 int tab_width) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
313 size_t str_len,
314 int column_target,
315 int tab_width) ATTR_WARN_UNUSED_RESULT
316 ATTR_NONNULL(1);
317
318int BLI_str_utf8_column_count(const char *str, size_t str_len) ATTR_WARN_UNUSED_RESULT
319 ATTR_NONNULL(1);
320
322#define BLI_UTF8_MAX 6
323#define BLI_UTF8_WIDTH_MAX 2 /* columns */
324#define BLI_UTF8_ERR ((unsigned int)-1)
325
326/* -------------------------------------------------------------------- */
331
332#define STRNCPY_UTF8(dst, src) BLI_strncpy_utf8(dst, src, ARRAY_SIZE(dst))
333#define STRNCPY_UTF8_RLEN(dst, src) BLI_strncpy_utf8_rlen(dst, src, ARRAY_SIZE(dst))
334
335#define STRNLEN_UTF8(str) BLI_strnlen_utf8(str, ARRAY_SIZE(str))
336
337#define SNPRINTF_UTF8(dst, format, ...) \
338 BLI_snprintf_utf8(dst, ARRAY_SIZE(dst), format, __VA_ARGS__)
339#define SNPRINTF_UTF8_RLEN(dst, format, ...) \
340 BLI_snprintf_utf8_rlen(dst, ARRAY_SIZE(dst), format, __VA_ARGS__)
341#define VSNPRINTF_UTF8(dst, format, args) BLI_vsnprintf_utf8(dst, ARRAY_SIZE(dst), format, args)
342#define VSNPRINTF_UTF8_RLEN(dst, format, args) \
343 BLI_vsnprintf_utf8_rlen(dst, ARRAY_SIZE(dst), format, args)
344
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_RETURNS_NONNULL
#define ATTR_PRINTF_FORMAT(format_param, dots_param)
#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)
size_t size_t BLI_vsnprintf_utf8_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format, va_list arg) ATTR_PRINTF_FORMAT(3
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)
size_t size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
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)
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
size_t BLI_vsnprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format, va_list arg) ATTR_PRINTF_FORMAT(3
const char * BLI_str_utf8_invalid_substitute_if_needed(const char *str, size_t str_len, const char substitute, char *buf, const size_t buf_maxncpy) ATTR_NONNULL(1
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)
size_t BLI_snprintf_utf8_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
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_str_utf8_column_count(const char *str, size_t str_len) ATTR_WARN_UNUSED_RESULT 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)
format