DDNet documentation
Loading...
Searching...
No Matches
str.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3
4#ifndef BASE_STR_H
5#define BASE_STR_H
6
7#include <array>
8#include <cinttypes>
9#include <cstdarg>
10#include <cstddef>
11#include <cstdint>
12#include <cstring>
13
19
20#ifdef __MINGW32__
21#undef PRId64
22#undef PRIu64
23#undef PRIX64
24#define PRId64 "I64d"
25#define PRIu64 "I64u"
26#define PRIX64 "I64X"
27#define PRIzu "Iu"
28#else
29#define PRIzu "zu"
30#endif
31
46int str_copy(char *dst, const char *src, int dst_size);
47
59template<int N>
60void str_copy(char (&dst)[N], const char *src)
61{
62 str_copy(dst, src, N);
63}
64
76template<size_t N>
77void str_copy(std::array<char, N> &dst, const char *src)
78{
79 str_copy(dst.data(), src, static_cast<int>(N));
80}
81
94void str_append(char *dst, const char *src, int dst_size);
95
107template<int N>
108void str_append(char (&dst)[N], const char *src)
109{
110 str_append(dst, src, N);
111}
112
127void str_truncate(char *dst, int dst_size, const char *src, int truncation_len);
128
138int str_length(const char *str);
139
156[[gnu::format(printf, 3, 0)]] int str_format_v(char *buffer, int buffer_size, const char *format, va_list args);
157
174[[gnu::format(printf, 3, 4)]] int str_format(char *buffer, int buffer_size, const char *format, ...);
175
176#if !defined(CONF_DEBUG)
177int str_format_int(char *buffer, size_t buffer_size, int value);
178
179template<typename... Args>
180int str_format_opt(char *buffer, int buffer_size, const char *format, Args... args)
181{
182 static_assert(sizeof...(args) > 0, "Use str_copy instead of str_format without format arguments");
183 return str_format(buffer, buffer_size, format, args...);
184}
185
186template<>
187inline int str_format_opt(char *buffer, int buffer_size, const char *format, int val) // NOLINT(readability-inconsistent-declaration-parameter-name)
188{
189 if(strcmp(format, "%d") == 0)
190 {
191 return str_format_int(buffer, buffer_size, val);
192 }
193 else
194 {
195 return str_format(buffer, buffer_size, format, val);
196 }
197}
198
199#define str_format str_format_opt
200#endif
201
202char str_uppercase(char c);
203
204bool str_isnum(char c);
205
206int str_isallnum(const char *str);
207
208int str_isallnum_hex(const char *str);
209
221int str_isspace(char c);
222
236const char *str_trim_words(const char *str, int words);
237
249bool str_has_cc(const char *str);
250
260void str_sanitize_cc(char *str);
261
272void str_sanitize(char *str);
273
280void str_sanitize_filename(char *str);
281
291bool str_valid_filename(const char *str);
292
307int str_comp_filenames(const char *a, const char *b);
308
318void str_clean_whitespaces(char *str);
319
333char *str_skip_to_whitespace(char *str);
334
340const char *str_skip_to_whitespace_const(const char *str);
341
355char *str_skip_whitespaces(char *str);
356
362const char *str_skip_whitespaces_const(const char *str);
363
379int str_comp_nocase(const char *a, const char *b);
380
398int str_comp_nocase_num(const char *a, const char *b, int num);
399
414int str_comp(const char *a, const char *b);
415
431int str_comp_num(const char *a, const char *b, int num);
432
446const char *str_startswith_nocase(const char *str, const char *prefix);
447
461const char *str_startswith(const char *str, const char *prefix);
462
476const char *str_endswith_nocase(const char *str, const char *suffix);
477
489const char *str_endswith(const char *str, const char *suffix);
490
506const char *str_find_nocase(const char *haystack, const char *needle);
507
521const char *str_find(const char *haystack, const char *needle);
522
537const char *str_next_token(const char *str, const char *delim, char *buffer, size_t buffer_size);
538
551int str_in_list(const char *list, const char *delim, const char *needle);
552
567bool str_delimiters_around_offset(const char *haystack, const char *delim, int offset, int *start, int *end);
568
583const char *str_rchr(const char *haystack, char needle);
584
599int str_countchr(const char *haystack, char needle);
600
613void str_hex(char *dst, int dst_size, const void *data, int data_size);
614
631void str_hex_cstyle(char *dst, int dst_size, const void *data, int data_size, int bytes_per_line = 12);
632
648int str_hex_decode(void *dst, int dst_size, const char *src);
649
662void str_base64(char *dst, int dst_size, const void *data, int data_size);
663
679int str_base64_decode(void *dst, int dst_size, const char *data);
680
688void str_escape(char **dst, const char *src, const char *end);
689
690int str_toint(const char *str);
691bool str_toint(const char *str, int *out);
692int str_toint_base(const char *str, int base);
693unsigned long str_toulong_base(const char *str, int base);
694int64_t str_toint64_base(const char *str, int base = 10);
695float str_tofloat(const char *str);
696bool str_tofloat(const char *str, float *out);
697
698unsigned str_quickhash(const char *str);
699
712int str_utf8_encode(char *ptr, int chr);
713
727int str_utf8_decode(const char **ptr);
728
742void str_utf8_truncate(char *dst, int dst_size, const char *src, int truncation_len);
743
755int str_utf8_fix_truncation(char *str);
756
767void str_utf8_trim_right(char *param);
768
782void str_utf8_tolower(const char *input, char *output, size_t size);
783
793int str_utf8_isspace(int code);
794
804int str_utf8_isstart(char c);
805
819int str_utf8_rewind(const char *str, int cursor);
820
837const char *str_utf8_find_nocase(const char *haystack, const char *needle, const char **end = nullptr);
838
851int str_utf8_comp_nocase(const char *a, const char *b);
852
866int str_utf8_comp_nocase_num(const char *a, const char *b, int num);
867
878const char *str_utf8_skip_whitespaces(const char *str);
879
893int str_utf8_forward(const char *str, int cursor);
894
906int str_utf8_check(const char *str);
907
921void str_utf8_copy_num(char *dst, const char *src, int dst_size, int num);
922
937void str_utf8_stats(const char *str, size_t max_size, size_t max_count, size_t *size, size_t *count);
938
952size_t str_utf8_offset_bytes_to_chars(const char *str, size_t byte_offset);
953
967size_t str_utf8_offset_chars_to_bytes(const char *str, size_t char_offset);
968
979int str_utf8_dist(const char *a, const char *b);
980
997int str_utf8_dist_buffer(const char *a, const char *b, int *buf, int buf_len);
998
1017int str_utf32_dist_buffer(const int *a, int a_len, const int *b, int b_len, int *buf, int buf_len);
1018
1019int str_utf8_to_skeleton(const char *str, int *buf, int buf_len);
1020
1031int str_utf8_comp_confusable(const char *str1, const char *str2);
1032
1042int str_utf8_tolower_codepoint(int code);
1043
1044#endif
const char * str_rchr(const char *haystack, char needle)
Definition str.cpp:563
void str_utf8_trim_right(char *param)
Definition str.cpp:1052
void str_hex_cstyle(char *dst, int dst_size, const void *data, int data_size, int bytes_per_line=12)
Definition str.cpp:595
int str_utf8_tolower_codepoint(int code)
Definition tolower.cpp:5
int str_utf8_comp_nocase(const char *a, const char *b)
Definition str.cpp:1151
char * str_skip_to_whitespace(char *str)
Definition str.cpp:323
size_t str_utf8_offset_chars_to_bytes(const char *str, size_t char_offset)
Definition str.cpp:1287
void str_utf8_copy_num(char *dst, const char *src, int dst_size, int num)
Definition str.cpp:1234
int str_length(const char *str)
Definition str.cpp:52
int str_utf8_forward(const char *str, int cursor)
Definition str.cpp:1211
int str_utf8_decode(const char **ptr)
Definition str.cpp:951
void str_sanitize(char *str)
Definition str.cpp:171
const char * str_find_nocase(const char *haystack, const char *needle)
Definition str.cpp:446
const char * str_startswith(const char *str, const char *prefix)
Definition str.cpp:393
void str_base64(char *dst, int dst_size, const void *data, int data_size)
Definition str.cpp:687
int str_utf8_encode(char *ptr, int chr)
Definition str.cpp:906
int str_utf8_isstart(char c)
Definition str.cpp:1106
bool str_has_cc(const char *str)
Definition str.cpp:144
int str_utf32_dist_buffer(const int *a, int a_len, const int *b, int b_len, int *buf, int buf_len)
Definition str.cpp:1340
void str_sanitize_cc(char *str)
Definition str.cpp:159
const char * str_skip_whitespaces_const(const char *str)
Definition str.cpp:344
const char * str_skip_to_whitespace_const(const char *str)
Definition str.cpp:330
const char * str_utf8_skip_whitespaces(const char *str)
Definition str.cpp:1191
int str_format_v(char *buffer, int buffer_size, const char *format, va_list args)
Definition str.cpp:57
int str_comp_num(const char *a, const char *b, int num)
Definition str.cpp:375
bool str_delimiters_around_offset(const char *haystack, const char *delim, int offset, int *start, int *end)
Definition str.cpp:531
int str_utf8_comp_confusable(const char *str1, const char *str2)
Definition confusables.cpp:82
const char * str_next_token(const char *str, const char *delim, char *buffer, size_t buffer_size)
Definition str.cpp:498
int str_base64_decode(void *dst, int dst_size, const char *data)
Definition str.cpp:764
void str_utf8_truncate(char *dst, int dst_size, const char *src, int truncation_len)
Definition str.cpp:1018
void str_utf8_stats(const char *str, size_t max_size, size_t max_count, size_t *size, size_t *count)
Definition str.cpp:1252
int str_hex_decode(void *dst, int dst_size, const char *src)
Definition str.cpp:670
int str_comp_filenames(const char *a, const char *b)
Definition str.cpp:258
void str_hex(char *dst, int dst_size, const void *data, int data_size)
Definition str.cpp:580
void str_utf8_tolower(const char *input, char *output, size_t size)
Definition str.cpp:1077
int str_comp_nocase(const char *a, const char *b)
Definition str.cpp:352
void str_truncate(char *dst, int dst_size, const char *src, int truncation_len)
Definition str.cpp:42
size_t str_utf8_offset_bytes_to_chars(const char *str, size_t byte_offset)
Definition str.cpp:1272
int str_countchr(const char *haystack, char needle)
Definition str.cpp:568
int str_comp(const char *a, const char *b)
Definition str.cpp:370
void str_append(char *dst, const char *src, int dst_size)
Definition str.cpp:25
int str_utf8_check(const char *str)
Definition str.cpp:1221
const char * str_utf8_find_nocase(const char *haystack, const char *needle, const char **end=nullptr)
Definition str.cpp:1124
void str_clean_whitespaces(char *str)
Definition str.cpp:292
int str_utf8_isspace(int code)
Definition str.cpp:1095
const char * str_startswith_nocase(const char *str, const char *prefix)
Definition str.cpp:380
int str_utf8_comp_nocase_num(const char *a, const char *b, int num)
Definition str.cpp:1167
const char * str_endswith_nocase(const char *str, const char *suffix)
Definition str.cpp:406
int str_copy(char *dst, const char *src, int dst_size)
Definition str.cpp:18
char * str_skip_whitespaces(char *str)
Definition str.cpp:337
int str_utf8_rewind(const char *str, int cursor)
Definition str.cpp:1113
int str_utf8_fix_truncation(char *str)
Definition str.cpp:1035
const char * str_find(const char *haystack, const char *needle)
Definition str.cpp:465
int str_comp_nocase_num(const char *a, const char *b, int num)
Definition str.cpp:361
int str_utf8_dist_buffer(const char *a, const char *b, int *buf, int buf_len)
Definition str.cpp:1320
int str_isspace(char c)
Definition str.cpp:126
const char * str_trim_words(const char *str, int words)
Definition str.cpp:131
int str_isallnum(const char *str)
Definition str.cpp:104
unsigned long str_toulong_base(const char *str, int base)
Definition str.cpp:871
int str_utf8_dist(const char *a, const char *b)
Definition str.cpp:1300
int str_toint_base(const char *str, int base)
Definition str.cpp:866
void str_escape(char **dst, const char *src, const char *end)
Definition str.cpp:833
void str_sanitize_filename(char *str)
Definition str.cpp:182
int str_in_list(const char *list, const char *delim, const char *needle)
Definition str.cpp:517
int str_format_int(char *buffer, size_t buffer_size, int value)
Definition str.cpp:70
int str_toint(const char *str)
Definition str.cpp:849
int str_format_opt(char *buffer, int buffer_size, const char *format, Args... args)
Definition str.h:180
bool str_isnum(char c)
Definition str.cpp:99
float str_tofloat(const char *str)
Definition str.cpp:881
unsigned str_quickhash(const char *str)
Definition str.cpp:898
#define str_format
Definition str.h:199
int str_isallnum_hex(const char *str)
Definition str.cpp:115
const char * str_endswith(const char *str, const char *suffix)
Definition str.cpp:426
char str_uppercase(char c)
Definition str.cpp:92
int64_t str_toint64_base(const char *str, int base=10)
Definition str.cpp:876
bool str_valid_filename(const char *str)
Definition str.cpp:196
int str_utf8_to_skeleton(const char *str, int *buf, int buf_len)
Definition confusables.cpp:65