annotate foosdk/sdk/pfc/string-interface.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 inline t_size _strParamLen(const char* str) { return strlen(str); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class NOVTABLE string_receiver {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 virtual void add_string(const char* p_string, t_size p_string_size = SIZE_MAX) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 inline void add_string_(const char* str) { add_string(str, _strParamLen(str)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 void add_char(t_uint32 c);//adds unicode char to the string
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void add_byte(char c) { add_string(&c, 1); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void add_chars(t_uint32 p_char, t_size p_count) { for (; p_count; p_count--) add_char(p_char); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 string_receiver() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 ~string_receiver() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 class NOVTABLE string_base : public pfc::string_receiver {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 virtual const char* get_ptr() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 const char* c_str() const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 virtual void add_string(const char* p_string, t_size p_length = SIZE_MAX) = 0;//same as string_receiver method
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 virtual void set_string(const char* p_string, t_size p_length = SIZE_MAX) { reset(); add_string(p_string, p_length); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual void truncate(t_size len) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual t_size get_length() const { return strlen(get_ptr()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 virtual char* lock_buffer(t_size p_requested_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual void unlock_buffer() = 0;
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 void set_string_(const char* str) { set_string(str, _strParamLen(str)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 inline const char* toString() const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! For compatibility with old conventions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 inline t_size length() const { return get_length(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 inline void reset() { truncate(0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 inline void clear() { truncate(0); }
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 inline bool is_empty() const { return *get_ptr() == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void skip_trailing_chars(const char* lstChars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 void skip_trailing_char(unsigned c = ' ');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 bool is_valid_utf8() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void convert_to_lower_ascii(const char* src, char replace = '?');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 inline const string_base& operator= (const char* src) { set_string_(src); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 inline const string_base& operator+= (const char* src) { add_string_(src); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 inline const string_base& operator= (const string_base& src) { set_string(src); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 inline const string_base& operator+= (const string_base& src) { add_string(src); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 bool operator==(const string_base& p_other) const { return strcmp(*this, p_other) == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 bool operator!=(const string_base& p_other) const { return strcmp(*this, p_other) != 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 bool operator>(const string_base& p_other) const { return strcmp(*this, p_other) > 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 bool operator<(const string_base& p_other) const { return strcmp(*this, p_other) < 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bool operator>=(const string_base& p_other) const { return strcmp(*this, p_other) >= 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 bool operator<=(const string_base& p_other) const { return strcmp(*this, p_other) <= 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 inline operator const char* () const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 t_size scan_filename() const;
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 t_size find_first(char p_char, t_size p_start = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 t_size find_last(char p_char, t_size p_start = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 t_size find_first(const char* p_string, t_size p_start = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 t_size find_last(const char* p_string, t_size p_start = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void fix_dir_separator(char c = '\\'); // Backwards compat function, "do what I mean" applied on non Windows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 void end_with(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 void end_with_slash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool ends_with(char c) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void delimit(const char* c) { if (length() > 0) add_string(c); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 char last_char() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void truncate_last_char();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void truncate_number_suffix();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Truncates string at first encountered end-of-line mark, starting search from startBytes position, in bytes..
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 bool truncate_eol(t_size startBytes = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! Truncates string at first encountered end-of-line mark, starting search from startBytes position, in bytes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! Adds append value if string was altered.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 bool fix_eol(const char* append = " (...)", t_size startBytes = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //! Limits string length to the specified value in actual characters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! That is, multi-byte UTF-8 characters will be counted as one and never broken apart.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 bool limit_length(t_size length_in_chars, const char* append = " (...)");
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 void truncate_filename() { truncate(scan_filename()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 void truncate_to_parent_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 void add_filename(const char* fn) { end_with_slash(); *this += fn; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Replaces one string with another. Returns the number of occurances - zero if the string was not altered.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 size_t replace_string(const char* replace, const char* replaceWith, t_size start = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! Replaces one string with another, writing the output to another string object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Returns the number of occurances replaced. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! Special: returns zero if no occurances were found - and the target string is NOT modified if so. Use with care!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 size_t replace_string_ex(pfc::string_base& target, const char* replace, const char* replaceWith, t_size start = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 string_base& _formatter() const { return const_cast<string_base&>(*this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 bool has_prefix(const char* prefix) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 bool has_prefix_i(const char* prefix) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 bool has_suffix(const char* suffix) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 bool has_suffix_i(const char* suffix) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 bool equals(const char* other) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 string_base() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 ~string_base() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }