foobar2000 SDK  2015-01-14
string_base.h
Go to the documentation of this file.
1 #ifndef _PFC_STRING_H_
2 #define _PFC_STRING_H_
3 
4 #include <string>
5 
6 namespace pfc {
7  inline t_size _strParamLen(const char * str) {
8  return strlen(str);
9  }
10 
11 
12  struct string_part_ref {
13  const char * m_ptr;
15 
16 
17  static string_part_ref make(const char * ptr, t_size len) {
18  string_part_ref val = {ptr, len}; return val;
19  }
20 
22  PFC_ASSERT( base <= m_len );
23  return make(m_ptr + base, m_len - base);
24  }
26  PFC_ASSERT( base <= m_len && base + len <= m_len );
27  return make(m_ptr + base, len);
28  }
29  };
30 
31  inline string_part_ref string_part(const char * ptr, t_size len) {
32  string_part_ref val = {ptr, len}; return val;
33  }
34 
35 
36  class NOVTABLE string_receiver {
37  public:
38  virtual void add_string(const char * p_string,t_size p_string_size = ~0) = 0;
39  inline void add_string_(const char * str) {add_string(str, _strParamLen(str));}
40 
41  void add_char(t_uint32 c);//adds unicode char to the string
42  void add_byte(char c) {add_string(&c,1);}
43  void add_chars(t_uint32 p_char,t_size p_count) {for(;p_count;p_count--) add_char(p_char);}
44  protected:
47  };
48 
49  t_size scan_filename(const char * ptr);
50 
51  bool is_path_separator(unsigned c);
52  bool is_path_bad_char(unsigned c);
53  bool is_valid_utf8(const char * param,t_size max = ~0);
54  bool is_lower_ascii(const char * param);
55  bool is_multiline(const char * p_string,t_size p_len = ~0);
56  bool has_path_bad_chars(const char * param);
57  void recover_invalid_utf8(const char * src,char * out,unsigned replace);//out must be enough to hold strlen(char) + 1, or appropiately bigger if replace needs multiple chars
58  void convert_to_lower_ascii(const char * src,t_size max,char * out,char replace = '?');//out should be at least strlen(src)+1 long
59 
60  template<typename char_t> inline char_t ascii_tolower(char_t c) {if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; return c;}
61  template<typename char_t> inline char_t ascii_toupper(char_t c) {if (c >= 'a' && c <= 'z') c += 'A' - 'a'; return c;}
62 
63  t_size string_find_first(const char * p_string,char p_tofind,t_size p_start = 0); //returns infinite if not found
64  t_size string_find_last(const char * p_string,char p_tofind,t_size p_start = ~0); //returns infinite if not found
65  t_size string_find_first(const char * p_string,const char * p_tofind,t_size p_start = 0); //returns infinite if not found
66  t_size string_find_last(const char * p_string,const char * p_tofind,t_size p_start = ~0); //returns infinite if not found
67 
68  t_size string_find_first_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start = 0); //returns infinite if not found
69  t_size string_find_last_ex(const char * p_string,t_size p_string_length,char p_tofind,t_size p_start = ~0); //returns infinite if not found
70  t_size string_find_first_ex(const char * p_string,t_size p_string_length,const char * p_tofind,t_size p_tofind_length,t_size p_start = 0); //returns infinite if not found
71  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 = ~0); //returns infinite if not found
72 
73 
74  t_size string_find_first_nc(const char * p_string,t_size p_string_length,char c,t_size p_start = 0); // lengths MUST be valid, no checks are performed (faster than the other flavour)
75  t_size string_find_first_nc(const char * p_string,t_size p_string_length,const char * p_tofind,t_size p_tofind_length,t_size p_start = 0); // lengths MUST be valid, no checks are performed (faster than the other falvour);
76 
77 
78  bool string_has_prefix( const char * string, const char * prefix );
79  bool string_has_prefix_i( const char * string, const char * prefix );
80  bool string_has_suffix( const char * string, const char * suffix );
81  bool string_has_suffix_i( const char * string, const char * suffix );
82 
83  template<typename t_char>
84  t_size strlen_max_t(const t_char * ptr,t_size max) {
85  PFC_ASSERT( ptr != NULL || max == 0 );
86  t_size n = 0;
87  while(n<max && ptr[n] != 0) n++;
88  return n;
89  }
90 
91  inline t_size strlen_max(const char * ptr,t_size max) throw() {return strlen_max_t(ptr,max);}
92  inline t_size wcslen_max(const wchar_t * ptr,t_size max) throw() {return strlen_max_t(ptr,max);}
93 
94 #ifdef _WINDOWS
95  inline t_size tcslen_max(const TCHAR * ptr,t_size max) {return strlen_max_t(ptr,max);}
96 #endif
97 
98  bool string_is_numeric(const char * p_string,t_size p_length = ~0) throw();
99  template<typename char_t> inline bool char_is_numeric(char_t p_char) throw() {return p_char >= '0' && p_char <= '9';}
100  inline bool char_is_hexnumeric(char p_char) throw() {return char_is_numeric(p_char) || (p_char >= 'a' && p_char <= 'f') || (p_char >= 'A' && p_char <= 'F');}
101  inline bool char_is_ascii_alpha_upper(char p_char) throw() {return p_char >= 'A' && p_char <= 'Z';}
102  inline bool char_is_ascii_alpha_lower(char p_char) throw() {return p_char >= 'a' && p_char <= 'z';}
103  inline bool char_is_ascii_alpha(char p_char) throw() {return char_is_ascii_alpha_lower(p_char) || char_is_ascii_alpha_upper(p_char);}
104  inline bool char_is_ascii_alphanumeric(char p_char) throw() {return char_is_ascii_alpha(p_char) || char_is_numeric(p_char);}
105 
106  unsigned atoui_ex(const char * ptr,t_size max);
107  t_int64 atoi64_ex(const char * ptr,t_size max);
108  t_uint64 atoui64_ex(const char * ptr,t_size max);
109 
110  //Throws exception_invalid_params on failure.
111  unsigned char_to_hex(char c);
112  unsigned char_to_dec(char c);
113 
114  //Throws exception_invalid_params or exception_overflow on failure.
115  template<typename t_uint> t_uint atohex(const char * in, t_size inLen) {
116  t_uint ret = 0;
117  const t_uint guard = (t_uint)0xF << (sizeof(t_uint) * 8 - 4);
118  for(t_size walk = 0; walk < inLen; ++walk) {
119  if (ret & guard) throw exception_overflow();
120  ret = (ret << 4) | char_to_hex(in[walk]);
121  }
122  return ret;
123  }
124  template<typename t_uint> t_uint atodec(const char * in, t_size inLen) {
125  t_uint ret = 0;
126  for(t_size walk = 0; walk < inLen; ++walk) {
127  const t_uint prev = ret;
128  ret = (ret * 10) + char_to_dec(in[walk]);
129  if ((ret / 10) != prev) throw exception_overflow();
130  }
131  return ret;
132  }
133 
134  t_size strlen_utf8(const char * s,t_size num = ~0) throw();//returns number of characters in utf8 string; num - no. of bytes (optional)
135  t_size utf8_char_len(const char * s,t_size max = ~0) throw();//returns size of utf8 character pointed by s, in bytes, 0 on error
136  t_size utf8_char_len_from_header(char c) throw();
137  t_size utf8_chars_to_bytes(const char * string,t_size count) throw();
138 
139  t_size strcpy_utf8_truncate(const char * src,char * out,t_size maxbytes);
140 
141  template<typename char_t> void strcpy_t( char_t * out, const char_t * in ) {
142  for(;;) { char_t c = *in++; *out++ = c; if (c == 0) break; }
143  }
144 
145  t_size utf8_decode_char(const char * src,unsigned & out,t_size src_bytes) throw();//returns length in bytes
146  t_size utf8_decode_char(const char * src,unsigned & out) throw();//returns length in bytes
147 
148  t_size utf8_encode_char(unsigned c,char * out) throw();//returns used length in bytes, max 6
149 
150 
151  t_size utf16_decode_char(const char16_t * p_source,unsigned * p_out,t_size p_source_length = ~0) throw();
152  t_size utf16_encode_char(unsigned c,char16_t * out) throw();
153 
154 #ifdef _MSC_VER
155  t_size utf16_decode_char(const wchar_t * p_source,unsigned * p_out,t_size p_source_length = ~0) throw();
156  t_size utf16_encode_char(unsigned c,wchar_t * out) throw();
157 #endif
158 
159  t_size wide_decode_char(const wchar_t * p_source,unsigned * p_out,t_size p_source_length = ~0) throw();
160  t_size wide_encode_char(unsigned c,wchar_t * out) throw();
161 
162 
163  t_size strstr_ex(const char * p_string,t_size p_string_len,const char * p_substring,t_size p_substring_len) throw();
164 
165 
166  t_size skip_utf8_chars(const char * ptr,t_size count) throw();
167  char * strdup_n(const char * src,t_size len);
168  int stricmp_ascii(const char * s1,const char * s2) throw();
169  int stricmp_ascii_ex(const char * s1,t_size len1,const char * s2,t_size len2) throw();
170  int naturalSortCompare( const char * s1, const char * s2) throw();
171  int naturalSortCompareI( const char * s1, const char * s2) throw();
172 
173  int strcmp_ex(const char* p1,t_size n1,const char* p2,t_size n2) throw();
174  int strcmp_nc(const char* p1, size_t n1, const char * p2, size_t n2) throw();
175 
176  unsigned utf8_get_char(const char * src);
177 
178  inline bool utf8_advance(const char * & var) throw() {
179  t_size delta = utf8_char_len(var);
180  var += delta;
181  return delta>0;
182  }
183 
184  inline bool utf8_advance(char * & var) throw() {
185  t_size delta = utf8_char_len(var);
186  var += delta;
187  return delta>0;
188  }
189 
190  inline const char * utf8_char_next(const char * src) throw() {return src + utf8_char_len(src);}
191  inline char * utf8_char_next(char * src) throw() {return src + utf8_char_len(src);}
192 
193  class NOVTABLE string_base : public pfc::string_receiver {
194  public:
195  virtual const char * get_ptr() const = 0;
196  virtual void add_string(const char * p_string,t_size p_length = ~0) = 0;//same as string_receiver method
197  virtual void set_string(const char * p_string,t_size p_length = ~0) {reset();add_string(p_string,p_length);}
198  virtual void truncate(t_size len)=0;
199  virtual t_size get_length() const {return strlen(get_ptr());}
200  virtual char * lock_buffer(t_size p_requested_length) = 0;
201  virtual void unlock_buffer() = 0;
202 
203  void set_string_(const char * str) {set_string(str, _strParamLen(str));}
204 
205  inline const char * toString() const {return get_ptr();}
206 
208  inline t_size length() const {return get_length();}
209 
210  inline void reset() {truncate(0);}
211 
212  inline bool is_empty() const {return *get_ptr()==0;}
213 
214  void skip_trailing_char(unsigned c = ' ');
215 
216  bool is_valid_utf8() const {return pfc::is_valid_utf8(get_ptr());}
217 
218  void convert_to_lower_ascii(const char * src,char replace = '?');
219 
220  inline const string_base & operator= (const char * src) {set_string_(src);return *this;}
221  inline const string_base & operator+= (const char * src) {add_string_(src);return *this;}
222  inline const string_base & operator= (const string_base & src) {set_string(src);return *this;}
223  inline const string_base & operator+= (const string_base & src) {add_string(src);return *this;}
224 
225  bool operator==(const string_base & p_other) const {return strcmp(*this,p_other) == 0;}
226  bool operator!=(const string_base & p_other) const {return strcmp(*this,p_other) != 0;}
227  bool operator>(const string_base & p_other) const {return strcmp(*this,p_other) > 0;}
228  bool operator<(const string_base & p_other) const {return strcmp(*this,p_other) < 0;}
229  bool operator>=(const string_base & p_other) const {return strcmp(*this,p_other) >= 0;}
230  bool operator<=(const string_base & p_other) const {return strcmp(*this,p_other) <= 0;}
231 
232  inline operator const char * () const {return get_ptr();}
233 
234  t_size scan_filename() const {return pfc::scan_filename(get_ptr());}
235 
236  t_size find_first(char p_char,t_size p_start = 0) const {return pfc::string_find_first(get_ptr(),p_char,p_start);}
237  t_size find_last(char p_char,t_size p_start = ~0) const {return pfc::string_find_last(get_ptr(),p_char,p_start);}
238  t_size find_first(const char * p_string,t_size p_start = 0) const {return pfc::string_find_first(get_ptr(),p_string,p_start);}
239  t_size find_last(const char * p_string,t_size p_start = ~0) const {return pfc::string_find_last(get_ptr(),p_string,p_start);}
240 
241  void fix_dir_separator(char c = '\\'); // Backwards compat function, "do what I mean" applied on non Windows
242  void end_with(char c);
243  void end_with_slash();
244  bool ends_with(char c) const;
245  void delimit(const char* c) {if (length()>0) add_string(c);}
246  char last_char() const;
247  void truncate_last_char();
248  void truncate_number_suffix();
249 
250  bool truncate_eol(t_size start = 0);
251  bool fix_eol(const char * append = " (...)",t_size start = 0);
252  bool limit_length(t_size length_in_chars,const char * append = " (...)");
253 
254  void truncate_filename() {truncate(scan_filename());}
255  void truncate_to_parent_path();
256  void add_filename( const char * fn ) {end_with_slash(); *this += fn; }
257 
258  t_size replace_string ( const char * replace, const char * replaceWith, t_size start = 0);
259 
260  string_base & _formatter() const {return const_cast<string_base&>(*this);}
261 
262  bool has_prefix( const char * prefix) const { return string_has_prefix( get_ptr(), prefix ); }
263  bool has_prefix_i( const char * prefix ) const { return string_has_prefix_i( get_ptr(), prefix); }
264  bool has_suffix( const char * suffix ) const { return string_has_suffix( get_ptr(), suffix); }
265  bool has_suffix_i( const char * suffix ) const { return string_has_suffix_i( get_ptr(), suffix); }
266  protected:
269  };
270 
271  template<t_size max_length>
273  public:
274  inline string_fixed_t() {init();}
275  inline string_fixed_t(const string_fixed_t<max_length> & p_source) {init(); *this = p_source;}
276  inline string_fixed_t(const char * p_source) {init(); set_string(p_source);}
277 
278  inline const string_fixed_t<max_length> & operator=(const string_fixed_t<max_length> & p_source) {set_string(p_source);return *this;}
279  inline const string_fixed_t<max_length> & operator=(const char * p_source) {set_string(p_source);return *this;}
280 
281  char * lock_buffer(t_size p_requested_length) {
282  if (p_requested_length >= max_length) return NULL;
283  memset(m_data,0,sizeof(m_data));
284  return m_data;
285  }
286  void unlock_buffer() {
287  m_length = strlen(m_data);
288  }
289 
290  inline operator const char * () const {return m_data;}
291 
292  const char * get_ptr() const {return m_data;}
293 
294  void add_string(const char * ptr,t_size len) {
295  len = strlen_max(ptr,len);
296  if (m_length + len < m_length || m_length + len > max_length) throw pfc::exception_overflow();
297  for(t_size n=0;n<len;n++) {
298  m_data[m_length++] = ptr[n];
299  }
300  m_data[m_length] = 0;
301  }
302  void truncate(t_size len) {
303  if (len > max_length) len = max_length;
304  if (m_length > len) {
305  m_length = len;
306  m_data[len] = 0;
307  }
308  }
309  t_size get_length() const {return m_length;}
310  private:
311  inline void init() {
312  PFC_STATIC_ASSERT(max_length>1);
313  m_length = 0; m_data[0] = 0;
314  }
316  char m_data[max_length+1];
317  };
318 
319  template<template<typename> class t_alloc>
320  class string8_t : public pfc::string_base {
321  private:
323  protected:
326 
327  inline void makespace(t_size s) {
328  if (t_alloc<char>::alloc_prioritizes_speed) {
329  m_data.set_size(s);
330  } else {
331  const t_size old_size = m_data.get_size();
332  if (old_size < s)
333  m_data.set_size(s + 16);
334  else if (old_size > s + 32)
335  m_data.set_size(s);
336  }
337  }
338 
339  inline const char * _get_ptr() const throw() {return used > 0 ? m_data.get_ptr() : "";}
340 
341  public:
342  inline void set_string_(const char * str) {set_string_nc(str, strlen(str));}
343  inline void add_string_(const char * str) {add_string_nc(str, strlen(str));}
344  void set_string_nc(const char * ptr, t_size len) {
345  PFC_ASSERT(! m_data.is_owned(ptr) );
346  PFC_ASSERT( strlen_max(ptr, len) == len );
347  makespace(len+1);
348  pfc::memcpy_t(m_data.get_ptr(),ptr,len);
349  used=len;
350  m_data[used]=0;
351  }
352  void add_string_nc(const char * ptr, t_size len) {
353  PFC_ASSERT(! m_data.is_owned(ptr) );
354  PFC_ASSERT( strlen_max(ptr, len) == len );
355  makespace(used+len+1);
356  pfc::memcpy_t(m_data.get_ptr() + used,ptr,len);
357  used+=len;
358  m_data[used]=0;
359  }
360  inline const t_self & operator= (const char * src) {set_string_(src);return *this;}
361  inline const t_self & operator+= (const char * src) {add_string_(src);return *this;}
362  inline const t_self & operator= (const string_base & src) {set_string(src);return *this;}
363  inline const t_self & operator+= (const string_base & src) {add_string(src);return *this;}
364  inline const t_self & operator= (const t_self & src) {set_string(src);return *this;}
365  inline const t_self & operator+= (const t_self & src) {add_string(src);return *this;}
366 
367  inline const t_self & operator= (string_part_ref src) {set_string(src);return *this;}
368  inline const t_self & operator+= (string_part_ref src) {add_string(src);return *this;}
369 
370  inline operator const char * () const throw() {return _get_ptr();}
371 
372  string8_t() : used(0) {}
373  string8_t(const char * p_string) : used(0) {set_string_(p_string);}
374  string8_t(const char * p_string,t_size p_length) : used(0) {set_string(p_string,p_length);}
375  string8_t(const t_self & p_string) : used(0) {set_string(p_string);}
376  string8_t(const string_base & p_string) : used(0) {set_string(p_string);}
377  string8_t(string_part_ref ref) : used(0) {set_string(ref);}
378 
379  void prealloc(t_size p_size) {m_data.prealloc(p_size+1);}
380 
381  const char * get_ptr() const throw() {return _get_ptr();}
382 
383  void add_string(const char * p_string,t_size p_length = ~0);
384  void set_string(const char * p_string,t_size p_length = ~0);
385 
388 
389  void truncate(t_size len)
390  {
391  if (used>len) {used=len;m_data[len]=0;makespace(used+1);}
392  }
393 
394  t_size get_length() const throw() {return used;}
395 
396 
397  void set_char(unsigned offset,char c);
398 
399  t_size replace_nontext_chars(char p_replace = '_');
400  t_size replace_char(unsigned c1,unsigned c2,t_size start = 0);
401  t_size replace_byte(char c1,char c2,t_size start = 0);
402  void fix_filename_chars(char def = '_',char leave=0);//replace "bad" characters, leave parameter can be used to keep eg. path separators
403  void remove_chars(t_size first,t_size count); //slow
404  void insert_chars(t_size first,const char * src, t_size count);//slow
405  void insert_chars(t_size first,const char * src);
406 
407  //for string_buffer class
408  char * lock_buffer(t_size n)
409  {
410  if (n + 1 == 0) throw exception_overflow();
411  makespace(n+1);
412  pfc::memset_t(m_data,(char)0);
413  return m_data.get_ptr();;
414  }
415 
416  void unlock_buffer() {
417  if (m_data.get_size() > 0) {
418  used=strlen(m_data.get_ptr());
419  makespace(used+1);
420  }
421  }
422 
423  void force_reset() {used=0;m_data.force_reset();}
424 
425  inline static void g_swap(t_self & p_item1,t_self & p_item2) {
426  pfc::swap_t(p_item1.m_data,p_item2.m_data);
427  pfc::swap_t(p_item1.used,p_item2.used);
428  }
429  };
430 
434  //for backwards compatibility
436 
437 
438  template<template<typename> class t_alloc> class traits_t<string8_t<t_alloc> > : public pfc::combine_traits<pfc::traits_vtable,pfc::traits_t<pfc::array_t<char,t_alloc> > > {
439  public:
440  enum {
442  };
443  };
444 }
445 
446 
447 
448 #include "string8_impl.h"
449 
450 #define PFC_DEPRECATE_PRINTF PFC_DEPRECATE("Use string8/string_fixed_t with operator<< overloads instead.")
451 
452 namespace pfc {
453 
455  private:
457  char * m_buffer;
458  public:
459  explicit string_buffer(string_base & p_string,t_size p_requested_length) : m_owner(p_string) {m_buffer = m_owner.lock_buffer(p_requested_length);}
461  char * get_ptr() {return m_buffer;}
462  operator char* () {return m_buffer;}
463  };
464 
465  class PFC_DEPRECATE_PRINTF string_printf : public string8_fastalloc {
466  public:
467  static void g_run(string_base & out,const char * fmt,va_list list);
468  void run(const char * fmt,va_list list);
469 
470  explicit string_printf(const char * fmt,...);
471  };
472 
473  class PFC_DEPRECATE_PRINTF string_printf_va : public string8_fastalloc {
474  public:
475  string_printf_va(const char * fmt,va_list list);
476  };
477 
478  class format_time {
479  public:
480  format_time(t_uint64 p_seconds);
481  const char * get_ptr() const {return m_buffer;}
482  operator const char * () const {return m_buffer;}
483  protected:
485  };
486 
487 
489  public:
490  format_time_ex(double p_seconds,unsigned p_extra = 3);
491  const char * get_ptr() const {return m_buffer;}
492  operator const char * () const {return m_buffer;}
493  private:
495  };
496 
497 
498  double parse_timecode( const char * tc );
499 
500  class string_filename : public string8 {
501  public:
502  explicit string_filename(const char * fn);
503  };
504 
505  class string_filename_ext : public string8 {
506  public:
507  explicit string_filename_ext(const char * fn);
508  };
509 
511  {
512  char buffer[32];
513  public:
514  inline const char * get_ptr() const {return buffer;}
515  inline t_size length() const {return strlen(buffer);}
516  inline operator const char * () const {return buffer;}
517  inline const char * toString() const {return buffer;}
518  explicit string_extension(const char * src);
519  };
520 
521 
523  {
524  public:
525  string_replace_extension(const char * p_path,const char * p_ext);
526  inline operator const char*() const {return m_data;}
527  private:
529  };
530 
532  {
533  public:
534  string_directory(const char * p_path);
535  inline operator const char*() const {return m_data;}
536  private:
538  };
539 
540  void float_to_string(char * out,t_size out_max,double val,unsigned precision,bool force_sign = false);//doesnt add E+X etc, has internal range limits, useful for storing float numbers as strings without having to bother with international coma/dot settings BS
541  double string_to_float(const char * src,t_size len = ~0);
542 
543  template<>
544  inline void swap_t(string8 & p_item1,string8 & p_item2)
545  {
546  string8::g_swap(p_item1,p_item2);
547  }
548 
550  {
551  public:
552  format_float(double p_val,unsigned p_width = 0,unsigned p_prec = 7);
553  format_float(const format_float & p_source) {*this = p_source;}
554 
555  inline const char * get_ptr() const {return m_buffer.get_ptr();}
556  inline const char * toString() const {return m_buffer.get_ptr();}
557  inline operator const char*() const {return m_buffer.get_ptr();}
558  private:
560  };
561 
563  {
564  public:
565  format_int(t_int64 p_val,unsigned p_width = 0,unsigned p_base = 10);
566  format_int(const format_int & p_source) {*this = p_source;}
567  inline const char * get_ptr() const {return m_buffer;}
568  inline const char * toString() const {return m_buffer;}
569  inline operator const char*() const {return m_buffer;}
570  private:
571  char m_buffer[64];
572  };
573 
574 
575  class format_uint {
576  public:
577  format_uint(t_uint64 p_val,unsigned p_width = 0,unsigned p_base = 10);
578  format_uint(const format_uint & p_source) {*this = p_source;}
579  inline const char * get_ptr() const {return m_buffer;}
580  inline const char * toString() const {return m_buffer;}
581  inline operator const char*() const {return m_buffer;}
582  private:
583  char m_buffer[64];
584  };
585 
587  {
588  public:
589  format_hex(t_uint64 p_val,unsigned p_width = 0);
590  format_hex(const format_hex & p_source) {*this = p_source;}
591  inline const char * get_ptr() const {return m_buffer;}
592  inline const char * toString() const {return m_buffer;}
593  inline operator const char*() const {return m_buffer;}
594  private:
595  char m_buffer[17];
596  };
597 
599  {
600  public:
601  format_hex_lowercase(t_uint64 p_val,unsigned p_width = 0);
602  format_hex_lowercase(const format_hex_lowercase & p_source) {*this = p_source;}
603  inline const char * get_ptr() const {return m_buffer;}
604  inline operator const char*() const {return m_buffer;}
605  inline const char * toString() const {return m_buffer;}
606  private:
607  char m_buffer[17];
608  };
609 
610  char format_hex_char_lowercase(unsigned p_val);
611  char format_hex_char(unsigned p_val);
612 
613 
615 #define PFC_string_formatter() ::pfc::string_formatter()._formatter()
616 
618  {
619  public:
620  format_hexdump(const void * p_buffer,t_size p_bytes,const char * p_spacing = " ");
621 
622  inline const char * get_ptr() const {return m_formatter;}
623  inline operator const char * () const {return m_formatter;}
624  inline const char * toString() const {return m_formatter;}
625  private:
626  string_formatter m_formatter;
627  };
628 
630  {
631  public:
632  format_hexdump_lowercase(const void * p_buffer,t_size p_bytes,const char * p_spacing = " ");
633 
634  inline const char * get_ptr() const {return m_formatter;}
635  inline operator const char * () const {return m_formatter;}
636  inline const char * toString() const {return m_formatter;}
637 
638  private:
639  string_formatter m_formatter;
640  };
641 
643  {
644  public:
645  format_fixedpoint(t_int64 p_val,unsigned p_point);
646  inline const char * get_ptr() const {return m_buffer;}
647  inline operator const char*() const {return m_buffer;}
648  inline const char * toString() const {return m_buffer;}
649  private:
650  string_formatter m_buffer;
651  };
652 
653  class format_char {
654  public:
655  format_char(char p_char) {m_buffer[0] = p_char; m_buffer[1] = 0;}
656  inline const char * get_ptr() const {return m_buffer;}
657  inline operator const char*() const {return m_buffer;}
658  inline const char * toString() const {return m_buffer;}
659  private:
660  char m_buffer[2];
661  };
662 
663  template<typename t_stringbuffer = pfc::string8_fastalloc>
665  public:
666  format_pad_left(t_size p_chars,t_uint32 p_padding /* = ' ' */,const char * p_string,t_size p_string_length = ~0) {
667  t_size source_len = 0, source_walk = 0;
668 
669  while(source_walk < p_string_length && source_len < p_chars) {
670  unsigned dummy;
671  t_size delta = pfc::utf8_decode_char(p_string + source_walk, dummy, p_string_length - source_walk);
672  if (delta == 0) break;
673  source_len++;
674  source_walk += delta;
675  }
676 
677  m_buffer.add_string(p_string,source_walk);
678  m_buffer.add_chars(p_padding,p_chars - source_len);
679  }
680  inline const char * get_ptr() const {return m_buffer;}
681  inline operator const char*() const {return m_buffer;}
682  inline const char * toString() const {return m_buffer;}
683  private:
684  t_stringbuffer m_buffer;
685  };
686 
687  template<typename t_stringbuffer = pfc::string8_fastalloc>
689  public:
690  format_pad_right(t_size p_chars,t_uint32 p_padding /* = ' ' */,const char * p_string,t_size p_string_length = ~0) {
691  t_size source_len = 0, source_walk = 0;
692 
693  while(source_walk < p_string_length && source_len < p_chars) {
694  unsigned dummy;
695  t_size delta = pfc::utf8_decode_char(p_string + source_walk, dummy, p_string_length - source_walk);
696  if (delta == 0) break;
697  source_len++;
698  source_walk += delta;
699  }
700 
701  m_buffer.add_chars(p_padding,p_chars - source_len);
702  m_buffer.add_string(p_string,source_walk);
703  }
704  inline const char * get_ptr() const {return m_buffer;}
705  inline operator const char*() const {return m_buffer;}
706  inline const char * toString() const {return m_buffer;}
707  private:
708  t_stringbuffer m_buffer;
709  };
710 
711 
712 
713  class format_file_size_short : public string_formatter {
714  public:
716  t_uint64 get_used_scale() const {return m_scale;}
717  private:
719  };
720 
721 }
722 
723 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,const char * p_source) {p_fmt.add_string_(p_source); return p_fmt;}
724 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,pfc::string_part_ref source) {p_fmt.add_string(source.m_ptr, source.m_len); return p_fmt;}
725 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,short p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
726 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned short p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
727 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,int p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
728 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
729 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,long p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
730 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned long p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
731 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,long long p_val) {p_fmt.add_string(pfc::format_int(p_val)); return p_fmt;}
732 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,unsigned long long p_val) {p_fmt.add_string(pfc::format_uint(p_val)); return p_fmt;}
733 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,double p_val) {p_fmt.add_string(pfc::format_float(p_val)); return p_fmt;}
734 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,std::exception const & p_exception) {p_fmt.add_string(p_exception.what()); return p_fmt;}
735 
736 template<template<typename> class t_alloc> inline pfc::string8_t<t_alloc> & operator<< (pfc::string8_t<t_alloc> & str, const char * src) {str.add_string_(src); return str;}
737 template<template<typename> class t_alloc> inline pfc::string8_t<t_alloc> & operator<< (pfc::string8_t<t_alloc> & str, pfc::string_base const & src) {str.add_string(src); return str;}
738 template<template<typename> class t_alloc> inline pfc::string8_t<t_alloc> & operator<< (pfc::string8_t<t_alloc> & str, pfc::string_part_ref src) {str.add_string(src); return str;}
739 
740 
741 namespace pfc {
742 
744  public:
745  template<typename t_source> format_array(t_source const & source, const char * separator = ", ") {
746  const t_size count = array_size_t(source);
747  if (count > 0) {
748  *this << source[0];
749  for(t_size walk = 1; walk < count; ++walk) *this << separator << source[walk];
750  }
751  }
752  };
753 
754 
756  public:
757  template<typename TWord> format_hexdump_ex(const TWord * buffer, t_size bufLen, const char * spacing = " ") {
758  for(t_size n = 0; n < bufLen; n++) {
759  if (n > 0 && spacing != NULL) m_formatter << spacing;
760  m_formatter << format_hex(buffer[n],sizeof(TWord) * 2);
761  }
762  }
763  inline const char * get_ptr() const {return m_formatter;}
764  inline operator const char * () const {return m_formatter;}
765  inline const char * toString() const {return m_formatter;}
766  private:
768  };
769 
770 
771 
772 
773 
774  template<typename t_char>
776  private:
778  public:
779  t_size length() const {
780  t_size s = m_buffer.get_size();
781  if (s == 0) return 0; else return s-1;
782  }
783  bool is_empty() const {return m_buffer.get_size() == 0;}
784 
785  void set_string_nc(const t_char * p_source, t_size p_length) {
786  if (p_length == 0) {
787  m_buffer.set_size(0);
788  } else {
789  m_buffer.set_size(p_length + 1);
790  pfc::memcpy_t(m_buffer.get_ptr(),p_source,p_length);
791  m_buffer[p_length] = 0;
792  }
793  }
794  void set_string(const t_char * p_source) {
795  set_string_nc(p_source, pfc::strlen_t(p_source));
796  }
797  void set_string(const t_char * p_source, t_size p_length) {
798  set_string_nc(p_source, strlen_max_t(p_source, p_length));
799  }
800  void add_string(const t_char * p_source, t_size p_length) {
801  add_string_nc(p_source, strlen_max_t(p_source, p_length));
802  }
803  void add_string(const t_char * p_source) {
804  add_string_nc(p_source, strlen_t(p_source));
805  }
806  void add_string_nc(const t_char * p_source, t_size p_length) {
807  if (p_length > 0) {
808  t_size base = length();
809  m_buffer.set_size( base + p_length + 1 );
810  memcpy_t(m_buffer.get_ptr() + base, p_source, p_length);
811  m_buffer[base + p_length] = 0;
812  }
813  }
815  string_simple_t(const t_char * p_source) {set_string(p_source);}
816  string_simple_t(const t_char * p_source, t_size p_length) {set_string(p_source, p_length);}
817  const t_self & operator=(const t_char * p_source) {set_string(p_source);return *this;}
818  operator const t_char* () const {return get_ptr();}
819  const t_char * get_ptr() const {return m_buffer.get_size() > 0 ? m_buffer.get_ptr() : pfc::empty_string_t<t_char>();}
820  private:
822  };
823 
825 
826  template<typename t_char> class traits_t<string_simple_t<t_char> > : public traits_t<array_t<t_char> > {};
827 }
828 
829 
830 namespace pfc {
832  public:
833  inline static int compare(const char * p_item1,const char * p_item2) {return strcmp(p_item1,p_item2);}
834  inline static int compare(const wchar_t * item1, const wchar_t * item2) {return wcscmp(item1, item2);}
835 
836  static int compare(const char * p_item1, string_part_ref p_item2) {
837  return strcmp_ex(p_item1, ~0, p_item2.m_ptr, p_item2.m_len);
838  }
839  static int compare(string_part_ref p_item1, string_part_ref p_item2) {
840  return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2.m_ptr, p_item2.m_len);
841  }
842  static int compare(string_part_ref p_item1, const char * p_item2) {
843  return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2, ~0);
844  }
845  };
846 
848  public:
849  inline static int compare(const char * p_item1,const char * p_item2) {return stricmp_ascii(p_item1,p_item2);}
850  };
851 
852 
854  public:
855  inline static int compare( const char * i1, const char * i2 ) throw() {return naturalSortCompare(i1, i2); }
856  };
857 
858  template<typename t_source> static void stringCombine(pfc::string_base & out, t_source const & in, const char * separator, const char * separatorLast) {
859  out.reset();
860  for(typename t_source::const_iterator walk = in.first(); walk.is_valid(); ++walk) {
861  if (!out.is_empty()) {
862  if (walk == in.last()) out << separatorLast;
863  else out << separator;
864  }
865  out << stringToPtr(*walk);
866  }
867  }
868 
869  template<typename t_output, typename t_splitCheck>
870  void splitStringEx(t_output & p_output, const t_splitCheck & p_check, const char * p_string, t_size p_stringLen = ~0) {
871  t_size walk = 0, splitBase = 0;
872  const t_size max = strlen_max(p_string,p_stringLen);
873  for(;walk < max;) {
874  t_size delta = p_check(p_string + walk,max - walk);
875  if (delta > 0) {
876  if (walk > splitBase) p_output(p_string + splitBase, walk - splitBase);
877  splitBase = walk + delta;
878  } else {
879  delta = utf8_char_len(p_string + walk, max - walk);
880  if (delta == 0) break;
881  }
882  walk += delta;
883  }
884  if (walk > splitBase) p_output(p_string + splitBase, walk - splitBase);
885  }
886 
888  public:
890  void operator() (const char *, t_size) {++m_count;}
891  t_size get() const {return m_count;}
892  private:
894  };
895 
896  template<typename t_param> class _splitStringSimple_check;
897 
898  template<> class _splitStringSimple_check<const char*> {
899  public:
900  _splitStringSimple_check(const char * p_chars) {
901  m_chars.set_size(strlen_utf8(p_chars));
902  for(t_size walk = 0, ptr = 0; walk < m_chars.get_size(); ++walk) {
903  ptr += utf8_decode_char(p_chars + ptr,m_chars[walk]);
904  }
905  }
906  t_size operator()(const char * p_string, t_size p_stringLen) const {
907  t_uint32 c;
908  t_size delta = utf8_decode_char(p_string, c, p_stringLen);
909  if (delta > 0) {
910  for(t_size walk = 0; walk < m_chars.get_size(); ++walk) {
911  if (m_chars[walk] == c) return delta;
912  }
913  }
914  return 0;
915  }
916  private:
918  };
919  template<> class _splitStringSimple_check<char> {
920  public:
921  _splitStringSimple_check(char c) : m_char(c) {}
922  t_size operator()(const char * str, t_size len) const {
923  PFC_ASSERT( len > 0 );
924  if (*str == m_char) return 1;
925  else return 0;
926  }
927  private:
928  const char m_char;
929  };
930  template<typename t_array>
932  public:
933  __splitStringSimple_arrayWrapper(t_array & p_array) : m_walk(), m_array(p_array) {}
934  void operator()(const char * p_string, t_size p_stringLen) {
935  m_array[m_walk++] = string_part(p_string,p_stringLen);
936  }
937  private:
939  t_array & m_array;
940  };
941  template<typename t_list>
943  public:
944  __splitStringSimple_listWrapper(t_list & p_list) : m_list(p_list) {}
945  void operator()(const char * p_string, t_size p_stringLen) {
946  m_list += string_part(p_string, p_stringLen);
947  }
948  private:
949  t_list & m_list;
950  };
951 
952  template<typename t_array, typename t_split>
953  void splitStringSimple_toArray(t_array & p_output, t_split p_split, const char * p_string, t_size p_stringLen = ~0) {
954  _splitStringSimple_check<t_split> strCheck(p_split);
955 
956  {
958  splitStringEx(wrapper,strCheck,p_string,p_stringLen);
959  p_output.set_size(wrapper.get());
960  }
961 
962  {
964  splitStringEx(wrapper,strCheck,p_string,p_stringLen);
965  }
966  }
967  template<typename t_list, typename t_split>
968  void splitStringSimple_toList(t_list & p_output, t_split p_split, const char * p_string, t_size p_stringLen = ~0) {
969  _splitStringSimple_check<t_split> strCheck(p_split);
970 
971  __splitStringSimple_listWrapper<t_list> wrapper(p_output);
972  splitStringEx(wrapper,strCheck,p_string,p_stringLen);
973  }
974 
975  template<typename t_out> void splitStringByLines(t_out & out, const char * str) {
976  for(;;) {
977  const char * next = strchr(str, '\n');
978  if (next == NULL) {
979  out += string_part(str, strlen(str)); break;
980  }
981  const char * walk = next;
982  while(walk > str && walk[-1] == '\r') --walk;
983  out += string_part(str, walk - str);
984  str = next + 1;
985  }
986  }
987  template<typename t_out> void splitStringByChar(t_out & out, const char * str, char c) {
988  for(;;) {
989  const char * next = strchr(str, c);
990  if (next == NULL) {
991  out += string_part(str, strlen(str)); break;
992  }
993  out += string_part(str, next - str);
994  str = next + 1;
995  }
996  }
997  template<typename t_out> void splitStringBySubstring(t_out & out, const char * str, const char * split) {
998  for(;;) {
999  const char * next = strstr(str, split);
1000  if (next == NULL) {
1001  out += string_part(str, strlen(str)); break;
1002  }
1003  out += string_part(str, next - str);
1004  str = next + strlen(split);
1005  }
1006  }
1007 
1008  void stringToUpperAppend(string_base & p_out, const char * p_source, t_size p_sourceLen);
1009  void stringToLowerAppend(string_base & p_out, const char * p_source, t_size p_sourceLen);
1010  int stringCompareCaseInsensitive(const char * s1, const char * s2);
1011  int stringCompareCaseInsensitiveEx(string_part_ref s1, string_part_ref s2);
1012  t_uint32 charLower(t_uint32 param);
1013  t_uint32 charUpper(t_uint32 param);
1014  bool stringEqualsI_utf8(const char * p1,const char * p2) throw();
1015  bool stringEqualsI_ascii(const char * p1,const char * p2) throw();
1016  char ascii_tolower_lookup(char c);
1017 
1018  template<typename T> inline const char * stringToPtr(T const& val) {return val.get_ptr();}
1019  template<> inline const char * stringToPtr(std::string const& val) {return val.c_str();}
1020  inline const char * stringToPtr(const char* val) {return val;}
1021 
1022  template<typename T> static string_part_ref stringToRef(T const & val) {return string_part(stringToPtr(val), val.length());}
1023  inline string_part_ref stringToRef(string_part_ref val) {return val;}
1024  inline string_part_ref stringToRef(const char * val) {return string_part(val, strlen(val));}
1025 
1026 
1027 
1028 
1029  class string_base_ref : public string_base {
1030  public:
1031  string_base_ref(const char * ptr) : m_ptr(ptr), m_len(strlen(ptr)) {}
1032  const char * get_ptr() const {return m_ptr;}
1033  t_size get_length() const {return m_len;}
1034  private:
1035  void add_string(const char * p_string,t_size p_length = ~0) {throw pfc::exception_not_implemented();}
1036  void set_string(const char * p_string,t_size p_length = ~0) {throw pfc::exception_not_implemented();}
1037  void truncate(t_size len) {throw pfc::exception_not_implemented();}
1038  char * lock_buffer(t_size p_requested_length) {throw pfc::exception_not_implemented();}
1039  void unlock_buffer() {throw pfc::exception_not_implemented();}
1040  private:
1041  const char * const m_ptr;
1042  t_size const m_len;
1043  };
1044 
1046  template<typename TChar, t_size len, typename TSource>
1047  void stringToBuffer(TChar (&buffer)[len], const TSource & source) {
1048  PFC_STATIC_ASSERT(len>0);
1049  t_size walk;
1050  for(walk = 0; walk < len - 1 && source[walk] != 0; ++walk) {
1051  buffer[walk] = source[walk];
1052  }
1053  buffer[walk] = 0;
1054  }
1055 
1057  template<typename TChar, t_size len, typename TSource>
1058  void stringToBufferGuarded(TChar (&buffer)[len], const TSource & source) {
1059  t_size walk;
1060  for(walk = 0; source[walk] != 0; ++walk) {
1061  if (walk >= len) throw exception_overflow();
1062  buffer[walk] = source[walk];
1063  }
1064  if (walk >= len) throw exception_overflow();
1065  buffer[walk] = 0;
1066  }
1067 
1068 
1069  template<typename t_char> int _strcmp_partial_ex(const t_char * p_string,t_size p_string_length,const t_char * p_substring,t_size p_substring_length) throw() {
1070  for(t_size walk=0;walk<p_substring_length;walk++) {
1071  t_char stringchar = (walk>=p_string_length ? 0 : p_string[walk]);
1072  t_char substringchar = p_substring[walk];
1073  int result = compare_t(stringchar,substringchar);
1074  if (result != 0) return result;
1075  }
1076  return 0;
1077  }
1078 
1079  template<typename t_char> int strcmp_partial_ex_t(const t_char * p_string,t_size p_string_length,const t_char * p_substring,t_size p_substring_length) throw() {
1080  p_string_length = strlen_max_t(p_string,p_string_length); p_substring_length = strlen_max_t(p_substring,p_substring_length);
1081  return _strcmp_partial_ex(p_string,p_string_length,p_substring,p_substring_length);
1082  }
1083 
1084  template<typename t_char>
1085  int strcmp_partial_t(const t_char * p_string,const t_char * p_substring) throw() {return strcmp_partial_ex_t(p_string,~0,p_substring,~0);}
1086 
1087  inline int strcmp_partial_ex(const char * str, t_size strLen, const char * substr, t_size substrLen) throw() {return strcmp_partial_ex(str, strLen, substr, substrLen); }
1088  inline int strcmp_partial(const char * str, const char * substr) throw() {return strcmp_partial_t(str, substr); }
1089 
1090  int stricmp_ascii_partial( const char * str, const char * substr) throw();
1091 
1092  void urlEncodeAppendRaw(pfc::string_base & out, const char * in, t_size inSize);
1093  void urlEncodeAppend(pfc::string_base & out, const char * in);
1094  void urlEncode(pfc::string_base & out, const char * in);
1095 
1096 }
1097 
1098 #endif //_PFC_STRING_H_
char * lock_buffer(t_size p_requested_length)
Definition: string_base.h:281
void set_string_nc(const t_char *p_source, t_size p_length)
Definition: string_base.h:785
t_size utf16_encode_char(unsigned c, char16_t *out)
Definition: utf8.cpp:165
string_part_ref substring(t_size base) const
Definition: string_base.h:21
char ascii_tolower_lookup(char c)
t_size skip_utf8_chars(const char *ptr, t_size count)
Definition: utf8.cpp:252
const char * toString() const
Definition: string_base.h:556
bool stringEqualsI_ascii(const char *p1, const char *p2)
char format_hex_char_lowercase(unsigned p_val)
void set_string_nc(const char *ptr, t_size len)
Definition: string_base.h:344
void set_string(const t_char *p_source, t_size p_length)
Definition: string_base.h:797
virtual t_size get_length() const
Definition: string_base.h:199
bool operator==(const string_base &p_other) const
Definition: string_base.h:225
void set_string(const char *p_string, t_size p_length=~0)
Definition: string8_impl.h:15
bool string_has_suffix(const char *string, const char *suffix)
format_fixedpoint(t_int64 p_val, unsigned p_point)
const t_item * get_ptr() const
Definition: array.h:213
char m_buffer[64]
Definition: string_base.h:583
t_size get_length() const
Definition: string_base.h:309
void fix_filename_chars(char def= '_', char leave=0)
Definition: string8_impl.h:32
char m_buffer[17]
Definition: string_base.h:595
string_base & m_owner
Definition: string_base.h:456
const char * stringToPtr(T const &val)
Definition: string_base.h:1018
t_size find_last(char p_char, t_size p_start=~0) const
Definition: string_base.h:237
t_size strstr_ex(const char *p_string, t_size p_string_len, const char *p_substring, t_size p_substring_len)
bool has_prefix(const char *prefix) const
Definition: string_base.h:262
string_part_ref substring(t_size base, t_size len) const
Definition: string_base.h:25
string_fixed_t(const char *p_source)
Definition: string_base.h:276
format_int(const format_int &p_source)
Definition: string_base.h:566
virtual void unlock_buffer()=0
void add_chars(t_uint32 p_char, t_size p_count)
Definition: string_base.h:43
unsigned char_to_hex(char c)
void splitStringByLines(t_out &out, const char *str)
Definition: string_base.h:975
void set_string(string_part_ref ref)
Definition: string_base.h:386
t_stringbuffer m_buffer
Definition: string_base.h:684
const char * get_ptr() const
Definition: string_base.h:634
int strcmp_partial_ex_t(const t_char *p_string, t_size p_string_length, const t_char *p_substring, t_size p_substring_length)
Definition: string_base.h:1079
const t_self & operator=(const t_char *p_source)
Definition: string_base.h:817
bool stringEqualsI_utf8(const char *p1, const char *p2)
t_size strcpy_utf8_truncate(const char *src, char *out, t_size maxbytes)
bool is_path_separator(unsigned c)
Definition: string_base.cpp:59
virtual void add_string(const char *p_string, t_size p_length=~0)=0
void splitStringByChar(t_out &out, const char *str, char c)
Definition: string_base.h:987
uint64_t t_uint64
Definition: int_types.h:3
void recover_invalid_utf8(const char *src, char *out, unsigned replace)
void truncate(t_size len)
Definition: string_base.h:389
static int compare(const char *p_item1, const char *p_item2)
Definition: string_base.h:849
format_array(t_source const &source, const char *separator=", ")
Definition: string_base.h:745
pfc::array_t< char, t_alloc > m_data
Definition: string_base.h:324
void splitStringSimple_toArray(t_array &p_output, t_split p_split, const char *p_string, t_size p_stringLen=~0)
Definition: string_base.h:953
string_simple_t(const t_char *p_source)
Definition: string_base.h:815
double string_to_float(const char *src, t_size max)
void truncate(t_size len)
Definition: string_base.h:302
bool operator>=(const string_base &p_other) const
Definition: string_base.h:229
format_char(char p_char)
Definition: string_base.h:655
format_time_ex(double p_seconds, unsigned p_extra=3)
t_uint atohex(const char *in, t_size inLen)
Definition: string_base.h:115
bool string_is_numeric(const char *p_string, t_size p_length)
pfc::string_base & operator<<(pfc::string_base &p_fmt, const char *p_source)
Definition: string_base.h:723
const char * get_ptr() const
Definition: string_base.h:622
string_simple_t(const t_char *p_source, t_size p_length)
Definition: string_base.h:816
void add_string_(const char *str)
Definition: string_base.h:343
const char * toString() const
Definition: string_base.h:568
void add_string_nc(const char *ptr, t_size len)
Definition: string_base.h:352
void delimit(const char *c)
Definition: string_base.h:245
bool char_is_ascii_alpha(char p_char)
Definition: string_base.h:103
const char * get_ptr() const
Definition: string_base.h:704
format_hexdump_lowercase(const void *p_buffer, t_size p_bytes, const char *p_spacing=" ")
const char * get_ptr() const
Definition: string_base.h:579
t_size utf8_encode_char(unsigned c, char *out)
Definition: utf8.cpp:113
const char * m_ptr
Definition: string_base.h:13
const char * utf8_char_next(const char *src)
Definition: string_base.h:190
void unlock_buffer()
Definition: string_base.h:416
const char * get_ptr() const
Definition: string_base.h:491
void splitStringEx(t_output &p_output, const t_splitCheck &p_check, const char *p_string, t_size p_stringLen=~0)
Definition: string_base.h:870
string_filename(const char *fn)
Definition: string_base.cpp:87
int _strcmp_partial_ex(const t_char *p_string, t_size p_string_length, const t_char *p_substring, t_size p_substring_length)
Definition: string_base.h:1069
t_size replace_char(unsigned c1, unsigned c2, t_size start=0)
Definition: string8_impl.h:97
int stricmp_ascii_ex(const char *const s1, t_size const len1, const char *const s2, t_size const len2)
t_size get_length() const
Definition: string_base.h:394
bool operator!=(const string_base &p_other) const
Definition: string_base.h:226
void set_char(unsigned offset, char c)
Definition: string8_impl.h:25
string_formatter m_formatter
Definition: string_base.h:626
bool is_multiline(const char *p_string, t_size p_len)
string_base_ref(const char *ptr)
Definition: string_base.h:1031
t_size wide_decode_char(const wchar_t *p_source, unsigned *p_out, t_size p_source_length=~0)
Definition: utf8.cpp:217
static int compare(string_part_ref p_item1, const char *p_item2)
Definition: string_base.h:842
const char * get_ptr() const
Definition: string_base.h:591
const char * get_ptr() const
Definition: string_base.h:567
bool string_has_suffix_i(const char *string, const char *suffix)
int strcmp_partial_ex(const char *str, t_size strLen, const char *substr, t_size substrLen)
Definition: string_base.h:1087
t_size scan_filename() const
Definition: string_base.h:234
format_pad_right(t_size p_chars, t_uint32 p_padding, const char *p_string, t_size p_string_length=~0)
Definition: string_base.h:690
void strcpy_t(char_t *out, const char_t *in)
Definition: string_base.h:141
format_file_size_short(t_uint64 size)
void makespace(t_size s)
Definition: string_base.h:327
char_t ascii_toupper(char_t c)
Definition: string_base.h:61
unsigned int t_uint
Definition: int_types.h:12
t_size operator()(const char *p_string, t_size p_stringLen) const
Definition: string_base.h:906
int stringCompareCaseInsensitiveEx(string_part_ref s1, string_part_ref s2)
t_stringbuffer m_buffer
Definition: string_base.h:708
string_buffer(string_base &p_string, t_size p_requested_length)
Definition: string_base.h:459
void remove_chars(t_size first, t_size count)
Definition: string8_impl.h:40
string8_t< pfc::alloc_standard > string8
Definition: string_base.h:431
int naturalSortCompare(const char *s1, const char *s2)
void add_string(string_part_ref ref)
Definition: string_base.h:387
void prealloc(t_size p_size)
Definition: string_base.h:379
bool has_suffix_i(const char *suffix) const
Definition: string_base.h:265
format_hex_lowercase(const format_hex_lowercase &p_source)
Definition: string_base.h:602
static void g_swap(t_self &p_item1, t_self &p_item2)
Definition: string_base.h:425
t_size find_first(const char *p_string, t_size p_start=0) const
Definition: string_base.h:238
unsigned utf8_get_char(const char *src)
Definition: utf8.cpp:238
format_time(t_uint64 p_seconds)
Definition: string_base.cpp:36
char_t ascii_tolower(char_t c)
Definition: string_base.h:60
const char * get_ptr() const
Definition: string_base.h:763
t_size operator()(const char *str, t_size len) const
Definition: string_base.h:922
const char * _get_ptr() const
Definition: string_base.h:339
static int compare(const char *i1, const char *i2)
Definition: string_base.h:855
string_fixed_t< 127 > m_buffer
Definition: string_base.h:494
t_uint atodec(const char *in, t_size inLen)
Definition: string_base.h:124
t_size utf8_char_len_from_header(char c)
Definition: utf8.cpp:10
bool char_is_hexnumeric(char p_char)
Definition: string_base.h:100
bool has_prefix_i(const char *prefix) const
Definition: string_base.h:263
void urlEncode(pfc::string_base &out, const char *in)
bool utf8_advance(const char *&var)
Definition: string_base.h:178
int strcmp_ex(const char *p1, t_size n1, const char *p2, t_size n2)
pfc::array_t< t_char > m_buffer
Definition: string_base.h:821
void truncate(t_size len)
Definition: string_base.h:1037
t_size string_find_first_ex(const char *p_string, t_size p_string_length, char p_tofind, t_size p_start)
int stricmp_ascii_partial(const char *str, const char *substr)
const char *const m_ptr
Definition: string_base.h:1041
const char * get_ptr() const
Definition: string_base.h:381
const char * get_ptr() const
Definition: string_base.h:656
bool is_valid_utf8() const
Definition: string_base.h:216
t_size string_find_first_nc(const char *p_string, t_size p_string_length, char c, t_size p_start)
t_size strlen_utf8(const char *s, t_size num=~0)
Definition: utf8.cpp:316
void add_string(const char *p_string, t_size p_length=~0)
Definition: string8_impl.h:4
void add_string(const char *ptr, t_size len)
Definition: string_base.h:294
void stringToLowerAppend(string_base &out, const char *src, t_size len)
string_simple_t< char > string_simple
Definition: string_base.h:824
bool operator<=(const string_base &p_other) const
Definition: string_base.h:230
string_extension(const char *src)
t_size strlen_max(const char *ptr, t_size max)
Definition: string_base.h:91
string8_t(const char *p_string, t_size p_length)
Definition: string_base.h:374
t_size strlen_t(const t_char *p_string, t_size p_length=~0)
Definition: primitives.h:771
size_t t_size
Definition: int_types.h:48
string8_fastalloc string_formatter
Definition: string_base.h:614
void stringToBufferGuarded(TChar(&buffer)[len], const TSource &source)
Same as stringToBuffer() but throws exception_overflow() if the string could not be fully written...
Definition: string_base.h:1058
string_replace_extension(const char *p_path, const char *p_ext)
static void stringCombine(pfc::string_base &out, t_source const &in, const char *separator, const char *separatorLast)
Definition: string_base.h:858
double parse_timecode(const char *in)
t_uint64 get_used_scale() const
Definition: string_base.h:716
void set_size(t_size p_size)
Definition: array.h:104
const char * toString() const
Definition: string_base.h:658
format_hexdump_ex(const TWord *buffer, t_size bufLen, const char *spacing=" ")
Definition: string_base.h:757
string_base & _formatter() const
Definition: string_base.h:260
__splitStringSimple_arrayWrapper(t_array &p_array)
Definition: string_base.h:933
const char * toString() const
Definition: string_base.h:605
const char * toString() const
Definition: string_base.h:624
int strcmp_partial_t(const t_char *p_string, const t_char *p_substring)
Definition: string_base.h:1085
int strcmp_nc(const char *p1, size_t n1, const char *p2, size_t n2)
string_fixed_t(const string_fixed_t< max_length > &p_source)
Definition: string_base.h:275
t_uint64 atoui64_ex(const char *src, t_size len)
virtual char * lock_buffer(t_size p_requested_length)=0
const char * get_ptr() const
Definition: string_base.h:646
const char * toString() const
Definition: string_base.h:682
const char * toString() const
Definition: string_base.h:648
void prealloc(t_size p_size)
Definition: array.h:216
void urlEncodeAppendRaw(pfc::string_base &out, const char *in, t_size inSize)
static string_part_ref make(const char *ptr, t_size len)
Definition: string_base.h:17
void set_string_(const char *str)
Definition: string_base.h:342
t_size scan_filename(const char *ptr)
void set_string_(const char *str)
Definition: string_base.h:203
int compare_t(const hasher_md5_result &p_item1, const hasher_md5_result &p_item2)
Definition: hasher_md5.h:20
char * strdup_n(const char *src, t_size len)
Definition: string_base.cpp:75
virtual void set_string(const char *p_string, t_size p_length=~0)
Definition: string_base.h:197
void stringToUpperAppend(string_base &out, const char *src, t_size len)
format_uint(t_uint64 p_val, unsigned p_width=0, unsigned p_base=10)
format_hexdump(const void *p_buffer, t_size p_bytes, const char *p_spacing=" ")
string_fixed_t< 127 > m_buffer
Definition: string_base.h:484
t_size length() const
Definition: string_base.h:779
t_size strlen_max_t(const t_char *ptr, t_size max)
Definition: string_base.h:84
void set_string(const t_char *p_source)
Definition: string_base.h:794
void operator()(const char *p_string, t_size p_stringLen)
Definition: string_base.h:945
char m_data[max_length+1]
Definition: string_base.h:316
string8_t< t_alloc > t_self
Definition: string_base.h:322
void splitStringBySubstring(t_out &out, const char *str, const char *split)
Definition: string_base.h:997
bool is_empty() const
Definition: string_base.h:212
const char * get_ptr() const
Definition: string_base.h:555
const char * get_ptr() const
Definition: string_base.h:292
unsigned atoui_ex(const char *p_string, t_size p_string_len)
const string_fixed_t< max_length > & operator=(const char *p_source)
Definition: string_base.h:279
string8_t(const string_base &p_string)
Definition: string_base.h:376
static int compare(const wchar_t *item1, const wchar_t *item2)
Definition: string_base.h:834
t_int64 atoi64_ex(const char *src, t_size len)
const char * toString() const
Definition: string_base.h:592
string_formatter m_formatter
Definition: string_base.h:767
string8_t(const t_self &p_string)
Definition: string_base.h:375
string_formatter m_buffer
Definition: string_base.h:650
bool string_has_prefix_i(const char *string, const char *prefix)
t_size utf16_decode_char(const char16_t *p_source, unsigned *p_out, t_size p_source_length=~0)
Definition: utf8.cpp:181
t_size string_find_last_ex(const char *p_string, t_size p_string_length, char p_tofind, t_size p_start)
t_size utf8_decode_char(const char *src, unsigned &out, t_size src_bytes)
Definition: utf8.cpp:64
char * lock_buffer(t_size n)
Definition: string_base.h:408
bool string_has_prefix(const char *string, const char *prefix)
void urlEncodeAppend(pfc::string_base &out, const char *in)
uint32_t charLower(uint32_t param)
const char * toString() const
Definition: string_base.h:706
void add_string(const char *p_string, t_size p_length=~0)
Definition: string_base.h:1035
static int compare(const char *p_item1, string_part_ref p_item2)
Definition: string_base.h:836
void add_string_nc(const t_char *p_source, t_size p_length)
Definition: string_base.h:806
int naturalSortCompareI(const char *s1, const char *s2)
string_formatter m_formatter
Definition: string_base.h:639
bool operator>(const string_base &p_other) const
Definition: string_base.h:227
string8_t(string_part_ref ref)
Definition: string_base.h:377
std::exception exception
Definition: primitives.h:193
void float_to_string(char *out, t_size out_max, double val, unsigned precision, bool b_sign)
bool is_valid_utf8(const char *param, t_size max=~0)
Definition: utf8.cpp:264
char * lock_buffer(t_size p_requested_length)
Definition: string_base.h:1038
void insert_chars(t_size first, const char *src, t_size count)
Definition: string8_impl.h:55
void stringToBuffer(TChar(&buffer)[len], const TSource &source)
Writes a string to a fixed-size buffer. Truncates the string if necessary. Always writes a null termi...
Definition: string_base.h:1047
const char * toString() const
Definition: string_base.h:205
t_size _strParamLen(const char *str)
Definition: string_base.h:7
uint32_t charUpper(uint32_t param)
void set_string(const char *p_string, t_size p_length=~0)
Definition: string_base.h:1036
t_size string_find_last(const char *p_string, char p_tofind, t_size p_start)
format_int(t_int64 p_val, unsigned p_width=0, unsigned p_base=10)
char m_buffer[64]
Definition: string_base.h:571
bool has_suffix(const char *suffix) const
Definition: string_base.h:264
int strcmp_partial(const char *str, const char *substr)
Definition: string_base.h:1088
t_size array_size_t(const t_array &p_array)
Definition: primitives.h:309
const t_self & operator+=(const char *src)
Definition: string_base.h:361
t_size wide_encode_char(unsigned c, wchar_t *out)
Definition: utf8.cpp:227
int stringCompareCaseInsensitive(const char *s1, const char *s2)
string8_t< pfc::alloc_fast > string8_fast
Definition: string_base.h:432
string_part_ref string_part(const char *ptr, t_size len)
Definition: string_base.h:31
format_float(double p_val, unsigned p_width=0, unsigned p_prec=7)
const char * toString() const
Definition: string_base.h:580
unsigned char_to_dec(char c)
void splitStringSimple_toList(t_list &p_output, t_split p_split, const char *p_string, t_size p_stringLen=~0)
Definition: string_base.h:968
int stricmp_ascii(const char *s1, const char *s2)
void add_byte(char c)
Definition: string_base.h:42
void add_string(const t_char *p_source)
Definition: string_base.h:803
static int compare(string_part_ref p_item1, string_part_ref p_item2)
Definition: string_base.h:839
bool char_is_numeric(char_t p_char)
Definition: string_base.h:99
format_uint(const format_uint &p_source)
Definition: string_base.h:578
bool char_is_ascii_alpha_lower(char p_char)
Definition: string_base.h:102
const string_fixed_t< max_length > & operator=(const string_fixed_t< max_length > &p_source)
Definition: string_base.h:278
bool char_is_ascii_alpha_upper(char p_char)
Definition: string_base.h:101
const char * get_ptr() const
Definition: string_base.h:514
t_size utf8_chars_to_bytes(const char *string, t_size count)
Definition: utf8.cpp:332
bool is_path_bad_char(unsigned c)
Definition: string_base.cpp:64
t_size const m_len
Definition: string_base.h:1042
void memcpy_t(t_dst *p_dst, const t_src *p_src, t_size p_count)
Definition: primitives.h:611
bool operator<(const string_base &p_other) const
Definition: string_base.h:228
t_size string_find_first(const char *p_string, char p_tofind, t_size p_start)
void operator()(const char *p_string, t_size p_stringLen)
Definition: string_base.h:934
char format_hex_char(unsigned p_val)
format_pad_left(t_size p_chars, t_uint32 p_padding, const char *p_string, t_size p_string_length=~0)
Definition: string_base.h:666
const char * get_ptr() const
Definition: string_base.h:680
void force_reset()
Definition: array.h:132
void swap_t(T &p_item1, T &p_item2)
Definition: primitives.h:285
t_size replace_nontext_chars(char p_replace= '_')
Definition: string8_impl.h:74
const t_self & operator=(const char *src)
Definition: string_base.h:360
format_hex(t_uint64 p_val, unsigned p_width=0)
bool char_is_ascii_alphanumeric(char p_char)
Definition: string_base.h:104
format_hex(const format_hex &p_source)
Definition: string_base.h:590
void add_string_(const char *str)
Definition: string_base.h:39
__splitStringSimple_listWrapper(t_list &p_list)
Definition: string_base.h:944
format_float(const format_float &p_source)
Definition: string_base.h:553
const char * toString() const
Definition: string_base.h:765
t_size get_size() const
Definition: array.h:130
void truncate_filename()
Definition: string_base.h:254
void memset_t(T *p_buffer, const t_val &p_val, t_size p_count)
Definition: primitives.h:627
void add_string(const t_char *p_source, t_size p_length)
Definition: string_base.h:800
bool has_path_bad_chars(const char *param)
string_filename_ext(const char *fn)
t_size utf8_char_len(const char *s, t_size max=~0)
Definition: utf8.cpp:246
static int compare(const char *p_item1, const char *p_item2)
Definition: string_base.h:833
bool is_lower_ascii(const char *param)
Definition: utf8.cpp:280
string8_t(const char *p_string)
Definition: string_base.h:373
void convert_to_lower_ascii(const char *src, t_size max, char *out, char replace)
t_size find_last(const char *p_string, t_size p_start=~0) const
Definition: string_base.h:239
string_directory(const char *p_path)
t_size find_first(char p_char, t_size p_start=0) const
Definition: string_base.h:236
string8_t< pfc::alloc_fast_aggressive > string8_fastalloc
Definition: string_base.h:435
t_size length() const
Definition: string_base.h:515
format_hex_lowercase(t_uint64 p_val, unsigned p_width=0)
const char * get_ptr() const
Definition: string_base.h:1032
void force_reset()
Definition: string_base.h:423
t_size tcslen_max(const TCHAR *ptr, t_size max)
Definition: string_base.h:95
static string_part_ref stringToRef(T const &val)
Definition: string_base.h:1022
const t_char * get_ptr() const
Definition: string_base.h:819
t_size replace_byte(char c1, char c2, t_size start=0)
Definition: string8_impl.h:85
uint32_t t_uint32
Definition: int_types.h:5
void add_filename(const char *fn)
Definition: string_base.h:256
bool is_empty() const
Definition: string_base.h:783
t_size wcslen_max(const wchar_t *ptr, t_size max)
Definition: string_base.h:92
const char * get_ptr() const
Definition: string_base.h:481
int64_t t_int64
Definition: int_types.h:2
t_size length() const
For compatibility with old conventions.
Definition: string_base.h:208
const char * toString() const
Definition: string_base.h:517
const char * get_ptr() const
Definition: string_base.h:603
t_size get_length() const
Definition: string_base.h:1033
const char * toString() const
Definition: string_base.h:636
string_simple_t< t_char > t_self
Definition: string_base.h:777
string8_t< pfc::alloc_fast_aggressive > string8_fast_aggressive
Definition: string_base.h:433
bool is_owned(const t_source &p_item)
Definition: array.h:230