annotate foosdk/sdk/pfc/string_base.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <utility> // std::forward
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "primitives.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "string-part.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 t_size scan_filename(const char * ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 bool is_path_separator(unsigned c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 bool is_path_bad_char(unsigned c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 bool is_valid_utf8(const char * param,t_size max = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool is_canonical_utf8(const char * param, size_t max = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 bool is_lower_ascii(const char * param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 bool is_multiline(const char * p_string,t_size p_len = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 bool has_path_bad_chars(const char * param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 void convert_to_lower_ascii(const char * src,t_size max,char * out,char replace = '?');//out should be at least strlen(src)+1 long
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 template<typename char_t> inline char_t ascii_tolower(char_t c) {if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; return c;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 template<typename char_t> inline char_t ascii_toupper(char_t c) {if (c >= 'a' && c <= 'z') c += 'A' - 'a'; return c;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 t_size string_find_first(const char * p_string,char p_tofind,t_size p_start = 0); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 t_size string_find_last(const char * p_string,char p_tofind,t_size p_start = SIZE_MAX); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 t_size string_find_first(const char * p_string,const char * p_tofind,t_size p_start = 0); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 t_size string_find_last(const char * p_string,const char * p_tofind,t_size p_start = SIZE_MAX); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 t_size string_find_first_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start = 0); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 t_size string_find_last_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start = SIZE_MAX); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 t_size string_find_first_ex(const char * p_string,t_size p_string_length,const char * p_tofind,t_size p_tofind_length,t_size p_start = 0); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 t_size string_find_last_ex(const char * p_string,t_size p_string_length,const char * p_tofind,t_size p_tofind_length,t_size p_start = SIZE_MAX); //returns infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_size string_find_first_nc(const char * p_string,t_size p_string_length,char c,t_size p_start = 0); // lengths MUST be valid, no checks are performed (faster than the other flavour)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 t_size string_find_first_nc(const char * p_string,t_size p_string_length,const char * p_tofind,t_size p_tofind_length,t_size p_start = 0); // lengths MUST be valid, no checks are performed (faster than the other falvour);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 bool string_has_prefix( const char * string, const char * prefix );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 bool string_has_prefix_i( const char * string, const char * prefix );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 const char * string_skip_prefix_i(const char* string, const char* prefix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 bool string_has_suffix( const char * string, const char * suffix );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 bool string_has_suffix_i( const char * string, const char * suffix );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 bool string_is_numeric(const char * p_string,t_size p_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 template<typename char_t> inline bool char_is_numeric(char_t p_char) noexcept {return p_char >= '0' && p_char <= '9';}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 inline bool char_is_hexnumeric(char p_char) noexcept {return char_is_numeric(p_char) || (p_char >= 'a' && p_char <= 'f') || (p_char >= 'A' && p_char <= 'F');}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 inline bool char_is_ascii_alpha_upper(char p_char) noexcept {return p_char >= 'A' && p_char <= 'Z';}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 inline bool char_is_ascii_alpha_lower(char p_char) noexcept {return p_char >= 'a' && p_char <= 'z';}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 inline bool char_is_ascii_alpha(char p_char) noexcept {return char_is_ascii_alpha_lower(p_char) || char_is_ascii_alpha_upper(p_char);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 inline bool char_is_ascii_alphanumeric(char p_char) noexcept {return char_is_ascii_alpha(p_char) || char_is_numeric(p_char);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 unsigned atoui_ex(const char * ptr,t_size max) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 t_int64 atoi64_ex(const char * ptr,t_size max) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 t_uint64 atoui64_ex(const char * ptr,t_size max) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 //Throws exception_invalid_params on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 unsigned char_to_hex(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 unsigned char_to_dec(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //Throws exception_invalid_params or exception_overflow on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename t_uint> t_uint atohex(const char * in, t_size inLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 t_uint ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 const t_uint guard = (t_uint)0xF << (sizeof(t_uint) * 8 - 4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 if (ret & guard) throw exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 ret = (ret << 4) | char_to_hex(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 template<typename t_uint> t_uint atodec(const char * in, t_size inLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 t_uint ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 const t_uint prev = ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 ret = (ret * 10) + char_to_dec(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if ((ret / 10) != prev) throw exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 t_size strlen_utf8(const char * s,t_size num = SIZE_MAX) noexcept;//returns number of characters in utf8 string; num - no. of bytes (optional)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 t_size utf8_char_len(const char * s,t_size max = SIZE_MAX) noexcept;//returns size of utf8 character pointed by s, in bytes, 0 on error
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 t_size utf8_char_len_from_header(char c) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 t_size utf8_chars_to_bytes(const char* string, t_size count) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 size_t strcpy_utf8_truncate(const char * src,char * out,size_t maxbytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 template<typename char_t> void strcpy_t( char_t * out, const char_t * in ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 for(;;) { char_t c = *in++; *out++ = c; if (c == 0) break; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 t_size utf8_decode_char(const char * src,unsigned & out,t_size src_bytes) noexcept;//returns length in bytes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 t_size utf8_decode_char(const char * src,unsigned & out) noexcept;//returns length in bytes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 t_size utf8_encode_char(unsigned c,char * out) noexcept;//returns used length in bytes, max 6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 t_size utf16_decode_char(const char16_t * p_source,unsigned * p_out,t_size p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 t_size utf16_encode_char(unsigned c,char16_t * out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 t_size utf16_decode_char(const wchar_t * p_source,unsigned * p_out,t_size p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 t_size utf16_encode_char(unsigned c,wchar_t * out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 t_size wide_decode_char(const wchar_t * p_source,unsigned * p_out,t_size p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 t_size wide_encode_char(unsigned c,wchar_t * out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 size_t uni_char_length(const char *);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 size_t uni_char_length(const char16_t *);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 size_t uni_char_length(const wchar_t *);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 size_t uni_decode_char(const char16_t * p_source, unsigned & p_out, size_t p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 size_t uni_decode_char(const char * p_source, unsigned & p_out, size_t p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 size_t uni_decode_char(const wchar_t * p_source, unsigned & p_out, size_t p_source_length = SIZE_MAX) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 size_t uni_encode_char(unsigned c, char* out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 size_t uni_encode_char(unsigned c, char16_t* out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 size_t uni_encode_char(unsigned c, wchar_t* out) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 #ifdef __cpp_char8_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 inline size_t uni_char_length(const char8_t* arg) { return uni_char_length(reinterpret_cast<const char*>(arg)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 inline size_t uni_decode_char(const char8_t* p_source, unsigned& p_out, size_t p_source_length = SIZE_MAX) noexcept { return uni_decode_char(reinterpret_cast<const char*>(p_source), p_out, p_source_length); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 inline size_t uni_encode_char(unsigned c, char8_t* out) noexcept { return uni_encode_char(c, reinterpret_cast<char*>(out)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 t_size strstr_ex(const char * p_string,t_size p_string_len,const char * p_substring,t_size p_substring_len) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 t_size skip_utf8_chars(const char * ptr,t_size count) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 char * strdup_n(const char * src,t_size len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 unsigned utf8_get_char(const char * src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 inline bool utf8_advance(const char * & var) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 t_size delta = utf8_char_len(var);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 var += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return delta>0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 inline bool utf8_advance(char * & var) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 t_size delta = utf8_char_len(var);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 var += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 return delta>0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 inline const char * utf8_char_next(const char * src) noexcept {return src + utf8_char_len(src);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 inline char * utf8_char_next(char * src) noexcept {return src + utf8_char_len(src);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 template<t_size max_length>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 class string_fixed_t : public pfc::string_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 inline string_fixed_t() {init();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 inline string_fixed_t(const string_fixed_t<max_length> & p_source) {init(); *this = p_source;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 inline string_fixed_t(const char * p_source) {init(); set_string(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 inline const string_fixed_t<max_length> & operator=(const string_fixed_t<max_length> & p_source) {set_string(p_source);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 inline const string_fixed_t<max_length> & operator=(const char * p_source) {set_string(p_source);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 char * lock_buffer(t_size p_requested_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (p_requested_length >= max_length) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 memset(m_data,0,sizeof(m_data));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 return m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void unlock_buffer() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 m_length = strlen(m_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 inline operator const char * () const {return m_data;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 const char * get_ptr() const {return m_data;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 void add_string(const char * ptr,t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 len = strlen_max(ptr,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 if (m_length + len < m_length || m_length + len > max_length) throw pfc::exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 for(t_size n=0;n<len;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 m_data[m_length++] = ptr[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 m_data[m_length] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void truncate(t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 if (len > max_length) len = max_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 if (m_length > len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 m_length = len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 m_data[len] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 t_size get_length() const {return m_length;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 inline void init() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 PFC_STATIC_ASSERT(max_length>1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 m_length = 0; m_data[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 t_size m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 char m_data[max_length+1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 typedef stringLite string8_fastalloc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 typedef stringLite string8_fast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 typedef stringLite string8_fast_aggressive;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 typedef stringLite string_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 typedef stringLite string;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 class string_buffer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 string_base & m_owner;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 char * m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 explicit string_buffer(string_base & p_string,t_size p_requested_length) : m_owner(p_string) {m_buffer = m_owner.lock_buffer(p_requested_length);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 ~string_buffer() {m_owner.unlock_buffer();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 char * get_ptr() {return m_buffer;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 operator char* () {return m_buffer;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 string8 string_printf(const char * fmt, ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 string8 string_printf_va(const char * fmt, va_list list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 void string_printf_here(string_base & out, const char * fmt, ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 void string_printf_here_va(string_base & out, const char * fmt, va_list list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 string8 format_time(uint64_t seconds);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 string8 format_time_ex(double seconds, unsigned extra = 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 double parse_timecode( const char * tc );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 string8 string_filename(const char * fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 string8 string_filename_ext(const char * fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 const char * filename_ext_v2 ( const char * fn, char slash = 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 string8 remove_ext_v2( const char * fileNameDotExt ); // Just removes extension, assumes argument to hold just filename.ext, not whole path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 const char * extract_ext_v2( const char * fileNameDotExt ); // Just extracts extension, assumes argument to hold just filename.ext, not whole path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 size_t find_extension_offset(const char * src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 string8 string_extension(const char * src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 string8 string_replace_extension(const char * p_path, const char * p_ext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 string8 string_directory(const char * p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 void float_to_string(char * out,t_size out_max,double val,unsigned precision,bool force_sign = false);//doesnt add E+X etc, has internal range limits, useful for storing float numbers as strings without having to bother with international coma/dot settings BS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 double string_to_float(const char * src,t_size len) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 double string_to_float(const char * src) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 string8 format_float(double p_val,unsigned p_width = 0,unsigned p_prec = 7);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 struct format_int_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 char m_buffer[64] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 inline const char* c_str() const { return m_buffer; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 inline const char* get_ptr() const { return m_buffer; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 inline operator const char* () const { return c_str(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 format_int_t format_int(t_int64 p_val, unsigned p_width = 0, unsigned p_base = 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 format_int_t format_uint(t_uint64 p_val, unsigned p_width = 0, unsigned p_base = 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 format_int_t format_hex(t_uint64 p_val, unsigned p_width = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 format_int_t format_hex_lowercase(t_uint64 p_val, unsigned p_width = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 char format_hex_char_lowercase(unsigned p_val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 char format_hex_char(unsigned p_val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 //typedef string8_fastalloc string_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 #define PFC_string_formatter() ::pfc::string_formatter()._formatter()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 string8 format_ptr( const void * ptr );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 string8 format_hexdump(const void * p_buffer,t_size p_bytes,const char * p_spacing = " ");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 string8 format_hexdump_lowercase(const void * p_buffer,t_size p_bytes,const char * p_spacing = " ");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 string8 format_fixedpoint(t_int64 p_val,unsigned p_point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 string8 format_char(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 string8 format_pad_left(t_size p_chars, t_uint32 p_padding /* = ' ' */, const char * p_string, t_size p_string_length = ~0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 string8 format_pad_right(t_size p_chars, t_uint32 p_padding /* = ' ' */, const char * p_string, t_size p_string_length = ~0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 string8 format_file_size_short(uint64_t size, uint64_t * outScaleUsed = nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 string8 format_index(size_t idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 string8 format_permutation(const size_t* arg, size_t n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 string8 format_mask(bit_array const& mask, size_t n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,const char * p_source) {p_fmt.add_string_(p_source); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 pfc::string_base & operator<<(pfc::string_base & p_fmt,const wchar_t* p_source); // string_conv.cpp
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,pfc::string_part_ref source) {p_fmt.add_string(source.m_ptr, source.m_len); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,short p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned short p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,int p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,long p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned long p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,long long p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned long long p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,double p_val) {p_fmt.add_string(pfc::format_float(p_val)); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,std::exception const & p_exception) {p_fmt.add_string(p_exception.what()); return p_fmt;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,pfc::format_int_t const& in) { p_fmt.add_string(in.c_str()); return p_fmt; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 template<typename t_source> string8 format_array(t_source const & source, const char * separator = ", ") {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 const t_size count = array_size_t(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 if (count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 ret << source[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 for(t_size walk = 1; walk < count; ++walk) ret << separator << source[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 template<typename TWord> string8 format_hexdump_ex(const TWord * buffer, t_size bufLen, const char * spacing = " ") {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 for(t_size n = 0; n < bufLen; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 if (n > 0 && spacing != NULL) ret << spacing;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 ret << format_hex(buffer[n],sizeof(TWord) * 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 typedef stringLite string_simple;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 void stringToUpperAppend(string_base & p_out, const char * p_source, t_size p_sourceLen = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 void stringToLowerAppend(string_base & p_out, const char * p_source, t_size p_sourceLen = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 void stringToUpperHere(string_base& p_out, const char* p_source, t_size p_sourceLen = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 void stringToLowerHere(string_base& p_out, const char* p_source, t_size p_sourceLen = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 t_uint32 charLower(t_uint32 param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 t_uint32 charUpper(t_uint32 param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 char ascii_tolower_lookup(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 class string_base_ref : public string_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 string_base_ref(const char * ptr) : m_ptr(ptr), m_len(strlen(ptr)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 const char * get_ptr() const {return m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 t_size get_length() const {return m_len;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 void add_string(const char *,t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 void set_string(const char *,t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 void truncate(t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 char * lock_buffer(t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 void unlock_buffer() {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 const char * const m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 t_size const m_len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 //! Writes a string to a fixed-size buffer. Truncates the string if necessary. Always writes a null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 template<typename TChar, t_size len, typename TSource>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 void stringToBuffer(TChar (&buffer)[len], const TSource & source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 PFC_STATIC_ASSERT(len>0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 t_size walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 for(walk = 0; walk < len - 1 && source[walk] != 0; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 buffer[walk] = source[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 buffer[walk] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 //! Same as stringToBuffer() but throws exception_overflow() if the string could not be fully written, including null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 template<typename TChar, t_size len, typename TSource>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 void stringToBufferGuarded(TChar (&buffer)[len], const TSource & source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 t_size walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 for(walk = 0; source[walk] != 0; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 if (walk >= len) throw exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 buffer[walk] = source[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 if (walk >= len) throw exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 buffer[walk] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 void urlEncodeAppendRaw(pfc::string_base & out, const char * in, t_size inSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 void urlEncodeAppend(pfc::string_base & out, const char * in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 void urlEncode(pfc::string_base & out, const char * in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 char * strDup(const char * src); // POSIX strdup() clone, prevent MSVC complaining
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 string8 lineEndingsToWin( const char * str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 string8 stringToUpper( const char * str, size_t len = SIZE_MAX );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 string8 stringToLower( const char * str, size_t len = SIZE_MAX );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 template<typename t_source> static void stringCombine(pfc::string_base& out, t_source const& in, const char* separator, const char* separatorLast) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 for (typename t_source::const_iterator walk = in.first(); walk.is_valid(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 if (!out.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 if (walk == in.last()) out << separatorLast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 else out << separator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 out << stringToPtr(*walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 template<typename TList>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 string stringCombineList(const TList& list, stringp separator) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 typename TList::const_iterator iter = list.first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 string acc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 if (iter.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 acc = *iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 for (++iter; iter.is_valid(); ++iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 acc = acc + separator + *iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 return acc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 inline void formatHere(pfc::string_base&) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 template<typename first_t, typename ... args_t> void formatHere(pfc::string_base& out, first_t && first, args_t && ... args) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 out << std::forward<first_t>(first);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 formatHere(out, std::forward<args_t>(args) ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 template<typename ... args_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 inline string format(args_t && ... args) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 string ret; formatHere(ret, std::forward<args_t>(args) ...); return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 pfc::string8 prefixLines(const char* str, const char* prefix, const char * setEOL = "\n");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 pfc::string8 recover_invalid_utf8(const char* in, const char* subst = "_");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 pfc::string8 string_trim_spacing(const char* in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 }