annotate foosdk/sdk/pfc/string_base.cpp @ 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 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "string_base.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "pathUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "primitives.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "other.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <set>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <math.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "splitString2.h"
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 namespace pfc {
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 string_base::is_valid_utf8() const { return pfc::is_valid_utf8(get_ptr()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 t_size string_base::scan_filename() const { return pfc::scan_filename(get_ptr()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 t_size string_base::find_first(char p_char, t_size p_start) const { return pfc::string_find_first(get_ptr(), p_char, p_start); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 t_size string_base::find_last(char p_char, t_size p_start) const { return pfc::string_find_last(get_ptr(), p_char, p_start); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 t_size string_base::find_first(const char* p_string, t_size p_start) const { return pfc::string_find_first(get_ptr(), p_string, p_start); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 t_size string_base::find_last(const char* p_string, t_size p_start) const { return pfc::string_find_last(get_ptr(), p_string, p_start); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 bool string_base::has_prefix(const char* prefix) const { return string_has_prefix(get_ptr(), prefix); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 bool string_base::has_prefix_i(const char* prefix) const { return string_has_prefix_i(get_ptr(), prefix); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 bool string_base::has_suffix(const char* suffix) const { return string_has_suffix(get_ptr(), suffix); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 bool string_base::has_suffix_i(const char* suffix) const { return string_has_suffix_i(get_ptr(), suffix); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 bool string_base::equals(const char* other) const { return strcmp(*this, other) == 0; }
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 void string_receiver::add_char(t_uint32 p_char)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 char temp[8];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 t_size len = utf8_encode_char(p_char,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (len>0) add_string(temp,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void string_base::skip_trailing_chars( const char * lstCharsStr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 std::set<unsigned> lstChars;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 for ( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 unsigned c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 auto delta = utf8_decode_char( lstCharsStr, c );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if ( delta == 0 ) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 lstCharsStr += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 lstChars.insert( c );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 const char * str = get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 t_size ptr,trunc = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 bool need_trunc = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 for(ptr=0;str[ptr];)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 unsigned c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 t_size delta = utf8_decode_char(str+ptr,c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 if (delta==0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 if ( lstChars.count( c ) > 0 )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (!need_trunc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 need_trunc = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 trunc = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 need_trunc = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 ptr += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 if (need_trunc) truncate(trunc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void string_base::skip_trailing_char(unsigned skip)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 const char * str = get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 t_size ptr,trunc = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 bool need_trunc = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 for(ptr=0;str[ptr];)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 unsigned c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 t_size delta = utf8_decode_char(str+ptr,c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if (delta==0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (c==skip)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (!need_trunc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 need_trunc = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 trunc = ptr;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 need_trunc = false;
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 ptr += delta;
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 if (need_trunc) truncate(trunc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
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 string8 format_time(uint64_t p_seconds) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 t_uint64 length = p_seconds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 unsigned weeks,days,hours,minutes,seconds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 weeks = (unsigned)( ( length / (60*60*24*7) ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 days = (unsigned)( ( length / (60*60*24) ) % 7 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 hours = (unsigned) ( ( length / (60 * 60) ) % 24);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 minutes = (unsigned) ( ( length / (60 ) ) % 60 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 seconds = (unsigned) ( ( length ) % 60 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 if (weeks) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 ret << weeks << "wk ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 if (days || weeks) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 ret << days << "d ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 if (hours || days || weeks) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 ret << hours << ":" << format_uint(minutes,2) << ":" << format_uint(seconds,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 ret << minutes << ":" << format_uint(seconds,2);
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 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 bool is_path_separator(unsigned c)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return c=='\\' || c=='/' || c=='|' || c==':';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 return c == '/';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 bool is_path_bad_char(unsigned c)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 #ifdef _WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return c=='\\' || c=='/' || c=='|' || c==':' || c=='*' || c=='?' || c=='\"' || c=='>' || c=='<';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 return c=='/' || c=='*' || c=='?';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 char * strdup_n(const char * src,t_size len)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 len = strlen_max(src,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 char * ret = (char*)malloc(len+1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (ret)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 memcpy(ret,src,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 ret[len]=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 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 string8 string_filename(const char * fn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 fn += pfc::scan_filename(fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 const char * ptr=fn,*dot=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 while(*ptr && *ptr!='?')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if (*ptr=='.') dot=ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
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 if (dot && dot>fn) ret.set_string(fn,dot-fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 else ret.set_string(fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
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 const char * extract_ext_v2( const char * filenameDotExt ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 auto split = strrchr(filenameDotExt, '.');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 return split ? split+1 : "";
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 string8 remove_ext_v2( const char * filenameDotExt ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 auto split = strrchr(filenameDotExt, '.');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if ( split ) ret.set_string_nc( filenameDotExt, split-filenameDotExt );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 else ret = filenameDotExt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 const char * filename_ext_v2( const char * fn, char slash ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 if ( slash == 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 slash = pfc::io::path::getDefaultSeparator();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 size_t split = pfc::string_find_last( fn, slash );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 if ( split == SIZE_MAX ) return fn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 return fn + split + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
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 string8 string_filename_ext(const char * fn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 fn += pfc::scan_filename(fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 const char * ptr = fn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 while(*ptr && *ptr!='?') ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 ret.set_string(fn,ptr-fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
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 size_t find_extension_offset(const char * src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 const char * start = src + pfc::scan_filename(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 const char * end = start + strlen(start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 const char * ptr = end - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 while (ptr > start && *ptr != '.')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 if (*ptr == '?') end = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 ptr--;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 if (ptr >= start && *ptr == '.')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 return ptr - src;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 string8 string_extension(const char * src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 const char * start = src + pfc::scan_filename(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 const char * end = start + strlen(start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 const char * ptr = end-1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 while(ptr>start && *ptr!='.')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 if (*ptr=='?') end=ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 ptr--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
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 if (ptr>=start && *ptr=='.')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 ret.set_string(ptr, end-ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 bool has_path_bad_chars(const char * param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 while(*param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 if (is_path_bad_char(*param)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 param++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
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 void float_to_string(char * out,t_size out_max,double val,unsigned precision,bool b_sign) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 pfc::string_fixed_t<63> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 t_size outptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 if (out_max == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 out_max--;//for null terminator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 outptr = 0;
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 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 if (val<0) {out[outptr++] = '-'; val = -val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 else if (val > 0 && b_sign) {out[outptr++] = '+';}
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 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
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 double powval = pow((double)10.0,(double)precision);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 temp << (t_int64)floor(val * powval + 0.5);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 //_i64toa(blargh,temp,10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 const t_size temp_len = temp.length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if (temp_len <= precision)
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 out[outptr++] = '0';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 out[outptr++] = '.';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 t_size d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 for(d=precision-temp_len;d;d--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 out[outptr++] = '0';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 for(d=0;d<temp_len;d++)
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 out[outptr++] = temp[d];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 t_size d = temp_len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 const char * src = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 if (d-- == precision)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 out[outptr++] = '.';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 out[outptr++] = *(src++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 if (outptr == out_max) {out[outptr]=0;return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 }
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 out[outptr] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 static double pfc_string_to_float_internal(const char * src) noexcept
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 bool neg = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 t_int64 val = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 int div = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 bool got_dot = false;
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 while(*src==' ') src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 if (*src=='-') {neg = true;src++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 else if (*src=='+') src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 if (*src>='0' && *src<='9')
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 int d = *src - '0';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 val = val * 10 + d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 if (got_dot) div--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 else if (*src=='.' || *src==',')
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 if (got_dot) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 got_dot = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 src++;
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 else if (*src=='E' || *src=='e')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 div += atoi(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 else break;
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 if (neg) val = -val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 if (val != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 // SPECIAL FIX: ensure 0.2 and 0.200000 return the EXACT same float
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 while (val % 10 == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 val /= 10; ++div;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 return (double) val * exp_int(10, div);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 double string_to_float(const char * src) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 return pfc_string_to_float_internal(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 double string_to_float(const char * src,t_size max) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 char blargh[128];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 if (max > 127) max = 127;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 t_size walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 for(walk = 0; walk < max && src[walk]; walk++) blargh[walk] = src[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 blargh[walk] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 return pfc_string_to_float_internal(blargh);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
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 void string_base::convert_to_lower_ascii(const char * src,char replace)
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 reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 PFC_ASSERT(replace>0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 unsigned c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 t_size delta = utf8_decode_char(src,c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 if (delta==0) {c = replace; delta = 1;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 else if (c>=0x80) c = replace;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 add_byte((char)c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 src += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
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 void convert_to_lower_ascii(const char * src,t_size max,char * out,char replace)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 t_size ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 PFC_ASSERT(replace>0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 while(ptr<max && src[ptr])
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 unsigned c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 t_size delta = utf8_decode_char(src+ptr,c,max-ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 if (delta==0) {c = replace; delta = 1;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 else if (c>=0x80) c = replace;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 *(out++) = (char)c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 ptr += delta;
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 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 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
399 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 p_string_len = strlen_max(p_string,p_string_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 p_substring_len = strlen_max(p_substring,p_substring_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 t_size index = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 while(index + p_substring_len <= p_string_len)
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 if (memcmp(p_string+index,p_substring,p_substring_len) == 0) return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 t_size delta = utf8_char_len(p_string+index,p_string_len - index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 index += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 unsigned atoui_ex(const char * p_string,t_size p_string_len) noexcept
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 unsigned ret = 0; t_size ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 while(ptr<p_string_len)
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 char c = p_string[ptr];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 if (! ( c >= '0' && c <= '9' ) ) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 ret = ret * 10 + (unsigned)( c - '0' );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 return ret;
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 int strcmp_nc(const char* p1, size_t n1, const char * p2, size_t n2) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 t_size idx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 if (idx == n1 && idx == n2) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 else if (idx == n1) return -1;//end of param1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 else if (idx == n2) return 1;//end of param2
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 char c1 = p1[idx], c2 = p2[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 if (c1<c2) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 else if (c1>c2) return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 int strcmp_ex(const char* p1,t_size n1,const char* p2,t_size n2) noexcept
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 n1 = strlen_max(p1,n1); n2 = strlen_max(p2,n2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 return strcmp_nc(p1, n1, p2, n2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 t_uint64 atoui64_ex(const char * src,t_size len) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 len = strlen_max(src,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 t_uint64 ret = 0, mul = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 t_size ptr = len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 t_size start = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 // start += skip_spacing(src+start,len-start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 while(ptr>start)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 char c = src[--ptr];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 if (c>='0' && c<='9')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 ret += (c-'0') * mul;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 mul *= 10;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 mul = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 t_int64 atoi64_ex(const char * src,t_size len) noexcept
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 len = strlen_max(src,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 t_int64 ret = 0, mul = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 t_size ptr = len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 t_size start = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 bool neg = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 // start += skip_spacing(src+start,len-start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 if (start < len && src[start] == '-') {neg = true; start++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 // start += skip_spacing(src+start,len-start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 while(ptr>start)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 char c = src[--ptr];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 if (c>='0' && c<='9')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 ret += (c-'0') * mul;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 mul *= 10;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 mul = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 return neg ? -ret : ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 string8 format_float(double p_val,unsigned p_width,unsigned p_prec)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 string8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 char temp[64];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 float_to_string(temp,64,p_val,p_prec,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 temp[63] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 t_size len = strlen(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 if (len < p_width)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 m_buffer.add_chars(' ',p_width-len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 m_buffer += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 return m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 char format_hex_char(unsigned p_val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 PFC_ASSERT(p_val < 16);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 return (p_val < 10) ? (char)p_val + '0' : (char)p_val - 10 + 'A';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 format_int_t format_hex(t_uint64 p_val,unsigned p_width)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 format_int_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 if (p_width > 16) p_width = 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 else if (p_width == 0) p_width = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 char temp[16];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 for(n=0;n<16;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 temp[15-n] = format_hex_char((unsigned)(p_val & 0xF));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 p_val >>= 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 for(n=0;n<16 && temp[n] == '0';n++) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 if (n > 16 - p_width) n = 16 - p_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 char * out = ret.m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 for(;n<16;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 *(out++) = temp[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 char format_hex_char_lowercase(unsigned p_val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 PFC_ASSERT(p_val < 16);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 return (p_val < 10) ? (char)p_val + '0' : (char)p_val - 10 + 'a';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 format_int_t format_hex_lowercase(t_uint64 p_val,unsigned p_width)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 format_int_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 if (p_width > 16) p_width = 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 else if (p_width == 0) p_width = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 char temp[16];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 for(n=0;n<16;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 temp[15-n] = format_hex_char_lowercase((unsigned)(p_val & 0xF));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 p_val >>= 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 for(n=0;n<16 && temp[n] == '0';n++) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 if (n > 16 - p_width) n = 16 - p_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 char * out = ret.m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 for(;n<16;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 *(out++) = temp[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 format_int_t format_uint(t_uint64 val,unsigned p_width,unsigned p_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 format_int_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 enum {max_width = PFC_TABSIZE(ret.m_buffer) - 1};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 if (p_width > max_width) p_width = max_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 else if (p_width == 0) p_width = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 char temp[max_width];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 for(n=0;n<max_width;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 temp[max_width-1-n] = format_hex_char((unsigned)(val % p_base));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 val /= p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 for(n=0;n<max_width && temp[n] == '0';n++) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 if (n > max_width - p_width) n = max_width - p_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 char * out = ret.m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 for(;n<max_width;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 *(out++) = temp[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 string8 format_fixedpoint(t_int64 p_val,unsigned p_point)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 string8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 unsigned div = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 for(unsigned n=0;n<p_point;n++) div *= 10;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 if (p_val < 0) {m_buffer << "-";p_val = -p_val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 m_buffer << format_int(p_val / div) << "." << format_int(p_val % div, p_point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 return m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 format_int_t format_int(t_int64 p_val,unsigned p_width,unsigned p_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 format_int_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 bool neg = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 t_uint64 val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 if (p_val < 0) {neg = true; val = (t_uint64)(-p_val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 else val = (t_uint64)p_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 enum {max_width = PFC_TABSIZE(ret.m_buffer) - 1};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 if (p_width > max_width) p_width = max_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 else if (p_width == 0) p_width = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 if (neg && p_width > 1) p_width --;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 char temp[max_width];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 for(n=0;n<max_width;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 temp[max_width-1-n] = format_hex_char((unsigned)(val % p_base));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 val /= p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 for(n=0;n<max_width && temp[n] == '0';n++) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 if (n > max_width - p_width) n = max_width - p_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 char * out = ret.m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 if (neg) *(out++) = '-';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 for(;n<max_width;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 *(out++) = temp[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 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
661 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 string8 m_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 const t_uint8 * buffer = (const t_uint8*)p_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 for(n=0;n<p_bytes;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 if (n > 0 && p_spacing != 0) m_formatter << p_spacing;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 m_formatter << format_hex_lowercase(buffer[n],2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 return m_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 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
674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 string8 m_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 const t_uint8 * buffer = (const t_uint8*)p_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 for(n=0;n<p_bytes;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 if (n > 0 && p_spacing != 0) m_formatter << p_spacing;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 m_formatter << format_hex(buffer[n],2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 return m_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 string8 string_replace_extension(const char * p_path,const char * p_ext)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 string8 m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 m_data = p_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 t_size dot = m_data.find_last('.');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 if (dot < m_data.scan_filename())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 {//argh
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 m_data += ".";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 m_data += p_ext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 m_data.truncate(dot+1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 m_data += p_ext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 return m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 string8 string_directory(const char * p_path)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 t_size ptr = scan_filename(p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 if (ptr > 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 if (is_path_separator(p_path[ptr-1]) && !is_path_separator(p_path[ptr-2])) --ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 ret.set_string(p_path,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 t_size scan_filename(const char * ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 t_size _used = strlen(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 for(n=_used;n!=0;n--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 if (is_path_separator(ptr[n-1])) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 t_size string_find_first(const char * p_string,char p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 for(t_size walk = p_start; p_string[walk]; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 if (p_string[walk] == p_tofind) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 t_size string_find_last(const char * p_string,char p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 return string_find_last_ex(p_string,SIZE_MAX,&p_tofind,1,p_start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 t_size string_find_first(const char * p_string,const char * p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 return string_find_first_ex(p_string,SIZE_MAX,p_tofind,SIZE_MAX,p_start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 t_size string_find_last(const char * p_string,const char * p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 return string_find_last_ex(p_string,SIZE_MAX,p_tofind,SIZE_MAX,p_start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 t_size string_find_first_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 for(t_size walk = p_start; walk < p_string_length && p_string[walk]; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 if (p_string[walk] == p_tofind) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 t_size string_find_last_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 return string_find_last_ex(p_string,p_string_length,&p_tofind,1,p_start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 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) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 p_string_length = strlen_max(p_string,p_string_length); p_tofind_length = strlen_max(p_tofind,p_tofind_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 if (p_string_length >= p_tofind_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 t_size max = p_string_length - p_tofind_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 for(t_size walk = p_start; walk <= max; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 if (_strcmp_partial_ex(p_string+walk,p_string_length-walk,p_tofind,p_tofind_length) == 0) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 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) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 p_string_length = strlen_max(p_string,p_string_length); p_tofind_length = strlen_max(p_tofind,p_tofind_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 if (p_string_length >= p_tofind_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 t_size max = min_t<t_size>(p_string_length - p_tofind_length,p_start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 for(t_size walk = max; walk != (t_size)(-1); walk--) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 if (_strcmp_partial_ex(p_string+walk,p_string_length-walk,p_tofind,p_tofind_length) == 0) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 t_size string_find_first_nc(const char * p_string,t_size p_string_length,char c,t_size p_start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 for(t_size walk = p_start; walk < p_string_length; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 if (p_string[walk] == c) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 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) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 if (p_string_length >= p_tofind_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 t_size max = p_string_length - p_tofind_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 for(t_size walk = p_start; walk <= max; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 if (memcmp(p_string+walk, p_tofind, p_tofind_length) == 0) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 bool string_is_numeric(const char * p_string,t_size p_length) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 bool retval = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 for(t_size walk = 0; walk < p_length && p_string[walk] != 0; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 if (!char_is_numeric(p_string[walk])) {retval = false; break;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 retval = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 return retval;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 void string_base::end_with(char p_char) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 if (!ends_with(p_char)) add_byte(p_char);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 bool string_base::ends_with(char c) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 t_size length = get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 return length > 0 && get_ptr()[length-1] == c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 void string_base::end_with_slash() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 end_with( io::path::getDefaultSeparator() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 char string_base::last_char() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 size_t l = this->length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 if (l == 0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 return this->get_ptr()[l-1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 void string_base::truncate_last_char() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 size_t l = this->length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 if (l > 0) this->truncate( l - 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 void string_base::truncate_number_suffix() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 size_t l = this->length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 const char * const p = this->get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 while( l > 0 && char_is_numeric( p[l-1] ) ) --l;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 truncate( l );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 bool is_multiline(const char * p_string,t_size p_len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 for(t_size n = 0; n < p_len && p_string[n]; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 switch(p_string[n]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 case '\r':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 case '\n':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 static t_uint64 pow10_helper(unsigned p_extra) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 t_uint64 ret = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 for(unsigned n = 0; n < p_extra; n++ ) ret *= 10;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 static uint64_t safeMulAdd(uint64_t prev, unsigned scale, uint64_t add) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 if (add >= scale || scale == 0) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 uint64_t v = prev * scale + add;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 if (v / scale != prev) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 static size_t parseNumber(const char * in, uint64_t & outNumber) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 size_t walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 uint64_t total = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 char c = in[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 if (!pfc::char_is_numeric(c)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 unsigned v = (unsigned)(c - '0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 uint64_t newVal = total * 10 + v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 if (newVal / 10 != total) throw pfc::exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 total = newVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 outNumber = total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 double parse_timecode(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 char separator = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 uint64_t seconds = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 unsigned colons = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 uint64_t number = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 size_t digits = parseNumber(in, number);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 if (digits == 0) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 in += digits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 char nextSeparator = *in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 switch (separator) { // *previous* separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 case '.':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 if (nextSeparator != 0) throw pfc::exception_bug_check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 return (double)seconds + (double)pfc::exp_int(10, -(int)digits) * number;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 case 0: // is first number in the string
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 seconds = number;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 case ':':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 if (colons == 2) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 ++colons;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 seconds = safeMulAdd(seconds, 60, number);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 if (nextSeparator == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 // end of string
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 return (double)seconds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 ++in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 separator = nextSeparator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 string8 format_time_ex(double p_seconds,unsigned p_extra) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 if (p_seconds < 0) {ret << "-"; p_seconds = -p_seconds;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 t_uint64 pow10 = pow10_helper(p_extra);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 t_uint64 ticks = pfc::rint64(pow10 * p_seconds);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 ret << pfc::format_time(ticks / pow10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 if (p_extra>0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 ret << "." << pfc::format_uint(ticks % pow10, p_extra);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 void stringToUpperHere(string_base& p_out, const char* p_source, t_size p_sourceLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 p_out.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 stringToUpperAppend(p_out, p_source, p_sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 void stringToLowerHere(string_base& p_out, const char* p_source, t_size p_sourceLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 p_out.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 stringToLowerAppend(p_out, p_source, p_sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 void stringToUpperAppend(string_base & out, const char * src, t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 while(len && *src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 unsigned c; t_size d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 d = utf8_decode_char(src,c,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 if (d==0 || d>len) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 out.add_char(charUpper(c));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 src+=d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 len-=d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 void stringToLowerAppend(string_base & out, const char * src, t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 while(len && *src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 unsigned c; t_size d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 d = utf8_decode_char(src,c,len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 if (d==0 || d>len) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 out.add_char(charLower(c));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 src+=d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 len-=d;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 string8 format_file_size_short(uint64_t size, uint64_t * outUsedScale) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 t_uint64 scale = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 const char * unit = "B";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 const char * const unitTable[] = {"B","KB","MB","GB","TB"};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 for(t_size walk = 1; walk < PFC_TABSIZE(unitTable); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 t_uint64 next = scale * 1024;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 if (size < next) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 scale = next; unit = unitTable[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 ret << ( size / scale );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 if (scale > 1 && ret.length() < 3) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 t_size digits = 3 - ret.length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 const t_uint64 mask = pow_int(10,digits);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 t_uint64 remaining = ( (size * mask / scale) % mask );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 while(digits > 0 && (remaining % 10) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 remaining /= 10; --digits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 if (digits > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 ret << "." << format_uint(remaining, (t_uint32)digits);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 ret << " " << unit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 if (outUsedScale != nullptr) *outUsedScale = scale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 pfc::string8 format_index(size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 return idx == SIZE_MAX ? "<n/a>" : pfc::format_uint(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 pfc::string8 format_permutation(const size_t* arg, size_t n) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 pfc::string_formatter ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 for( size_t walk = 0; walk < n; ++ walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 if (arg[walk] != walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 if ( !ret.is_empty() ) ret << ", ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 ret << arg[walk] << "->" << walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 pfc::string8 format_mask(pfc::bit_array const& mask, size_t n) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 pfc::string_formatter ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 mask.for_each(true, 0, n, [&] (size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 if (!ret.is_empty() ) ret << ", ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 ret << idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 bool string_base::truncate_eol(t_size start)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 const char * ptr = get_ptr() + start;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 for(t_size n=start;*ptr;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 if (*ptr==10 || *ptr==13)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 truncate(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 bool string_base::fix_eol(const char * append,t_size start)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 const bool rv = truncate_eol(start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 if (rv) add_string(append);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 bool string_base::limit_length(t_size length_in_chars,const char * append)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 const char * base = get_ptr(), * ptr = base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 while(length_in_chars && utf8_advance(ptr)) length_in_chars--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 if (length_in_chars==0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 truncate(ptr-base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 add_string(append);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 rv = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 void string_base::truncate_to_parent_path() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 size_t at = scan_filename();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 while(at > 0 && (*this)[at-1] == '\\') --at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 if (at > 0 && (*this)[at-1] == ':' && (*this)[at] == '\\') ++at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 // Strip trailing /
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 while(at > 0 && (*this)[at-1] == '/') --at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 // Hit empty? Bring root / back to life
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 if (at == 0 && (*this)[0] == '/') ++at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 // Deal with proto://
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 if (at > 0 && (*this)[at-1] == ':') {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 while((*this)[at] == '/') ++at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 this->truncate( at );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 size_t string_base::replace_string(const char * replace, const char * replaceWith, t_size start) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 size_t ret = replace_string_ex(temp, replace, replaceWith, start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 if ( ret > 0 ) * this = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 size_t string_base::replace_string_ex (string_base & temp, const char * replace, const char * replaceWith, t_size start) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 size_t srcDone = 0, walk = start;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 size_t occurances = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 const char * const source = this->get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 bool clear = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 const size_t replaceLen = strlen( replace );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 const char * ptr = strstr( source + walk, replace );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 if (ptr == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 // end
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 if (srcDone == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 return 0; // string not altered
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 temp.add_string( source + srcDone );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 ++occurances;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 walk = ptr - source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 if (! clear ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 temp.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 clear = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 temp.add_string( source + srcDone, walk - srcDone );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 temp.add_string( replaceWith );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 walk += replaceLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 srcDone = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 return occurances;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 void urlEncodeAppendRaw(pfc::string_base & out, const char * in, t_size inSize) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 for(t_size walk = 0; walk < inSize; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 const char c = in[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 if (c == ' ') out.add_byte('+');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 else if (pfc::char_is_ascii_alphanumeric(c) || c == '_') out.add_byte(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 else out << "%" << pfc::format_hex((t_uint8)c, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 void urlEncodeAppend(pfc::string_base & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 const char c = *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 if (c == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 else if (c == ' ') out.add_byte('+');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 else if (pfc::char_is_ascii_alphanumeric(c) || c == '_') out.add_byte(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 else out << "%" << pfc::format_hex((t_uint8)c, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 void urlEncode(pfc::string_base & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 out.reset(); urlEncodeAppend(out, in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 unsigned char_to_dec(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 PFC_ASSERT(c != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 if (c >= '0' && c <= '9') return (unsigned)(c - '0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 else throw exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 unsigned char_to_hex(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 if (c >= '0' && c <= '9') return (unsigned)(c - '0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 else if (c >= 'a' && c <= 'f') return (unsigned)(c - 'a' + 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 else if (c >= 'A' && c <= 'F') return (unsigned)(c - 'A' + 10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 else throw exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 static constexpr t_uint8 ascii_tolower_table[128] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 uint32_t charLower(uint32_t param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 if (param<128) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 return ascii_tolower_table[param];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 else if (param<0x10000) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 return (uint32_t)(size_t)CharLowerW((WCHAR*)(size_t)param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 else return param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 uint32_t charUpper(uint32_t param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 if (param<128) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 if (param>='a' && param<='z') param -= (uint32_t)( 'a' - 'A' );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 return param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 else if (param<0x10000) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 return (uint32_t)(size_t)CharUpperW((WCHAR*)(size_t)param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 else return param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 bool stringEqualsI_ascii(const char * p1,const char * p2) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 char c1 = *p1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 char c2 = *p2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 if (c1 > 0 && c2 > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 if (ascii_tolower_table[ (unsigned) c1 ] != ascii_tolower_table[ (unsigned) c2 ]) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 if (c1 == 0 && c2 == 0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 if (c1 == 0 || c2 == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 if (c1 != c2) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 ++p1; ++p2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 bool stringEqualsI_utf8(const char * p1,const char * p2) noexcept
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 char c1 = *p1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 char c2 = *p2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 if (c1 > 0 && c2 > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 if (ascii_tolower_table[ (unsigned) c1 ] != ascii_tolower_table[ (unsigned) c2 ]) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 ++p1; ++p2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 if (c1 == 0 && c2 == 0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 if (c1 == 0 || c2 == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 unsigned w1,w2; t_size d1,d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 d1 = utf8_decode_char(p1,w1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 d2 = utf8_decode_char(p2,w2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 if (d1 == 0 || d2 == 0) return false; // bad UTF-8, bail
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 if (w1 != w2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 if (charLower(w1) != charLower(w2)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 p1 += d1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 p2 += d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199 char ascii_tolower_lookup(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 PFC_ASSERT( c >= 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 return (char)ascii_tolower_table[ (unsigned) c ];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 void string_base::fix_dir_separator(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 end_with(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 end_with_slash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 bool string_has_prefix( const char * string, const char * prefix ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 for(size_t w = 0; ; ++w ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 char c = prefix[w];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 if (c == 0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 if (string[w] != c) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 const char* string_skip_prefix_i(const char* string, const char* prefix) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 const char* p1 = string; const char* p2 = prefix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 unsigned w1, w2; size_t d1, d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 d1 = utf8_decode_char(p1, w1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 d2 = utf8_decode_char(p2, w2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 if (d2 == 0) return p1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 if (d1 == 0) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 if (w1 != w2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 if (charLower(w1) != charLower(w2)) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 p1 += d1; p2 += d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 bool string_has_prefix_i( const char * string, const char * prefix ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 return string_skip_prefix_i(string, prefix) != nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 bool string_has_suffix( const char * string, const char * suffix ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 size_t len = strlen( string );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 size_t suffixLen = strlen( suffix );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 if (suffixLen > len) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 size_t base = len - suffixLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 return memcmp( string + base, suffix, suffixLen * sizeof(char)) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 bool string_has_suffix_i( const char * string, const char * suffix ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 if (*string == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 if (stringEqualsI_utf8( string, suffix )) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 if (!utf8_advance(string)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 char * strDup(const char * src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 return _strdup(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 return strdup(src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 string_part_ref string_part_ref::make(const char * ptr, t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 string_part_ref val = {ptr, len}; return val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 string_part_ref string_part_ref::substring(t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 PFC_ASSERT( base <= m_len );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 return make(m_ptr + base, m_len - base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 string_part_ref string_part_ref::substring(t_size base, t_size len) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 PFC_ASSERT( base <= m_len && base + len <= m_len );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 return make(m_ptr + base, len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 string_part_ref string_part_ref::make( const char * str ) {return make( str, strlen(str) ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 bool string_part_ref::equals( string_part_ref other ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 if ( other.m_len != this->m_len ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 return memcmp( other.m_ptr, this->m_ptr, m_len ) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 bool string_part_ref::equals( const char * str ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 return equals(make(str) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 string8 lineEndingsToWin(const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 const char * walk = str;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 for( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 const char * eol = strchr( walk, '\n' );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 if ( eol == nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 ret += walk; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 const char * next = eol + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 if ( eol > walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 if (eol[-1] == '\r') --eol;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 if ( eol > walk ) ret.add_string_nc(walk, eol-walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 ret.add_string_nc("\r\n",2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 walk = next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 string8 format_char(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305 string8 ret; ret.add_byte(c); return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 string8 format_ptr( const void * ptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 temp << "0x";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 temp << format_hex_lowercase( (size_t) ptr, sizeof(ptr) * 2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316 string8 format_pad_left(t_size p_chars, t_uint32 p_padding, const char * p_string, t_size p_string_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 string8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 t_size source_len = 0, source_walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 while (source_walk < p_string_length && source_len < p_chars) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 unsigned dummy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 t_size delta = pfc::utf8_decode_char(p_string + source_walk, dummy, p_string_length - source_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 source_len++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 source_walk += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 m_buffer.add_string(p_string, source_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329 m_buffer.add_chars(p_padding, p_chars - source_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 return m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 string8 format_pad_right(t_size p_chars, t_uint32 p_padding, const char * p_string, t_size p_string_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 string8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 t_size source_len = 0, source_walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 while (source_walk < p_string_length && source_len < p_chars) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 unsigned dummy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339 t_size delta = pfc::utf8_decode_char(p_string + source_walk, dummy, p_string_length - source_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 source_len++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342 source_walk += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 m_buffer.add_chars(p_padding, p_chars - source_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 m_buffer.add_string(p_string, source_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 return m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 string8 stringToUpper(const char * str, size_t len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352 stringToUpperAppend(ret, str, len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 string8 stringToLower(const char * str, size_t len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 stringToLowerAppend(ret, str, len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361 pfc::string8 prefixLines(const char* str, const char* prefix, const char * setEOL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 const auto temp = pfc::splitStringByLines2(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 pfc::string8 ret; ret.prealloc(1024);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 for (auto& line : temp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 if ( line.length() > 0 ) ret << prefix << line << setEOL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 pfc::string8 recover_invalid_utf8(const char* in, const char* subst) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 pfc::string8 ret; ret.prealloc(strlen(in));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 char c = *in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 if (c == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 if (c < ' ') {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 ret += subst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 ret.add_byte(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 ++in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384 static bool is_spacing(char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 switch (c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 case ' ': case '\n': case '\r': case '\t': return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 default: return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 pfc::string8 string_trim_spacing(const char* in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 const char* temp_ptr = in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 while (is_spacing(*temp_ptr)) temp_ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 const char* temp_start = temp_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 const char* temp_end = temp_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395 while (*temp_ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 if (!is_spacing(*temp_ptr)) temp_end = temp_ptr + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398 temp_ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 return string_part_ref { temp_start, (size_t)(temp_end - temp_start) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 } //namespace pfc