annotate foosdk/sdk/pfc/string-lite.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-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "string_base.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 const unsigned alloc_minimum = 128;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 void stringLite::add_string(const char* p_string, t_size p_string_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 add_string_nc(p_string, strlen_max(p_string, p_string_size));
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void stringLite::add_string_nc(const char* ptr, size_t length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (length > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 const size_t base = m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 const size_t newLen = base + length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 makeRoom(newLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 memcpy(p + base, ptr, length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 p[newLen] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_length = newLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 m_ptr = p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
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 }
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 void stringLite::set_string(const char* p_string, t_size p_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 set_string_nc(p_string, strlen_max(p_string, p_length));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void stringLite::set_string_nc(const char* ptr, size_t length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (length > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 makeRoom(length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 memcpy(p, ptr, length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 p[length] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 m_ptr = p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_length = length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 clear();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 void stringLite::truncate(t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (len < m_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 makeRoom(len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 if (len > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 p[len] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 m_ptr = p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 m_ptr = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 m_length = len;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 char* stringLite::lock_buffer(t_size p_requested_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 makeRoom(p_requested_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 memset(m_mem.ptr(), 0, m_mem.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return (char*)m_mem.ptr();
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 void stringLite::unlock_buffer() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 m_ptr = p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 m_length = strlen(p);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 void stringLite::clear() noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 m_ptr = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 m_length = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if (!m_noShrink && m_mem.size() > alloc_minimum) m_mem.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void stringLite::copy(stringLite const& other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 set_string_nc(other.m_ptr, other.m_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 // m_noShrink deliberately NOT transferred
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 void stringLite::move(stringLite& other) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 m_ptr = other.m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 m_length = other.m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 m_mem = std::move(other.m_mem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 m_noShrink = other.m_noShrink;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 other._clear();
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 void stringLite::_clear() noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 m_ptr = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 m_length = 0;
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 stringLite::makeRoom(size_t newLength) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 size_t size = newLength + 1; // null term
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if (m_mem.size() < size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 size_t target = (size / 2) * 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (target < alloc_minimum) target = alloc_minimum;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 m_mem.resize(target);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 } else if (!m_noShrink && m_mem.size() / 2 >= size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 size_t target = size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (target < alloc_minimum) target = alloc_minimum;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 m_mem.resize(target);
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 }
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 stringLite const& stringLite::operator=(const string_base& src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 set_string_nc(src.c_str(), src.length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 return *this;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 stringLite::stringLite(const string_base& src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 set_string_nc(src.c_str(), src.length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 stringLite::stringLite(string_part_ref const& ref) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 set_string_nc(ref.m_ptr, ref.m_len);
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 stringLite const& stringLite::operator=(const string_part_ref& ref) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 set_string_nc(ref.m_ptr, ref.m_len); return *this;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 size_t stringLite::replace_nontext_chars(char p_replace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 size_t ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 for (size_t w = 0; w < m_length; ++w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 if ((uint8_t)p[w] < 32) { p[w] = p_replace; ++ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return ret;
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 size_t stringLite::replace_char(unsigned c1, unsigned c2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (c1 < 128 && c2 < 128) return replace_byte((char)c1, (char)c2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 unsigned start = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 stringLite temp(get_ptr() + start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 truncate(start);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 const char* ptr = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 t_size rv = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 while (*ptr)
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 unsigned test;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 t_size delta = utf8_decode_char(ptr, test);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 if (delta == 0 || test == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 if (test == c1) { test = c2; rv++; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 add_char(test);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 ptr += delta;
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 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 size_t stringLite::replace_byte(char c1, char c2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 size_t ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 for (size_t w = 0; w < m_length; ++w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (p[w] == c1) { p[w] = c2; ++ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
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 void stringLite::set_char(size_t offset, char c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if (offset < m_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 if (c == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 truncate(offset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 p[offset] = c;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void stringLite::prealloc(size_t s) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 m_noShrink = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 makeRoom(s);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void stringLite::remove_chars(t_size first, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (count == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 if (count == m_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 PFC_ASSERT(first + count > first);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 PFC_ASSERT(first + count <= m_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 size_t last = first + count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 size_t trailing = m_length - last;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 memmove(p + first, p + last, trailing + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 size_t newLen = m_length - count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 makeRoom(newLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 m_length = newLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 m_ptr = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 void stringLite::insert_chars_nc(t_size first, const char* src, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if (count == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 if (first > m_length) first = m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 size_t trailing = m_length - first;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 size_t newLen = m_length + count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 makeRoom(newLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 auto p = (char*)m_mem.ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 memmove(p + first + count, p + first, trailing + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 memcpy(p + first, src, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 m_length = newLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 m_ptr = p;
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 void stringLite::insert_chars(t_size first, const char* src, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 insert_chars_nc(first, src, strlen_max(src, count));
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 void stringLite::insert_chars(t_size first, const char* src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 insert_chars_nc(first, src, strlen(src));
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 bool stringLite::equals(const stringLite& other) const noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 return equals(*this, other);
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 bool stringLite::equals(const char* other) const noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 return strcmp(c_str(), other) == 0;
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 bool stringLite::equals(const stringLite& v1, const stringLite& v2) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 if (v1.m_length != v2.m_length) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 return memcmp(v1.m_ptr, v2.m_ptr, v1.m_length) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 bool stringLite::greater(const char* v1, size_t s1, const char* v2, size_t s2) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if (s1 > s2) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 if (s1 < s2) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 return memcmp(v1, v2, s1) > 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 bool stringLite::greater(const stringLite& v1, const stringLite& v2) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 return greater(v1.m_ptr, v1.m_length, v2.m_ptr, v2.m_length);
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 stringLite stringLite::lowerCase() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 stringLite ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 pfc::stringToLowerAppend(ret, this->c_str(), this->length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 return ret;
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 stringLite stringLite::upperCase() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 stringLite ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 pfc::stringToUpperAppend(ret, this->c_str(), this->length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 stringLite stringLite::subString(t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 if (base > length()) throw exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 return string(c_str() + base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 stringLite stringLite::subString(t_size base, t_size count) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 return string(c_str() + base, count);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 t_size stringLite::indexOf(char c, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 return pfc::string_find_first(ptr(), c, base);
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 t_size stringLite::lastIndexOf(char c, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 return pfc::string_find_last(ptr(), c, base);
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 t_size stringLite::indexOf(stringp s, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 return pfc::string_find_first(ptr(), s, base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 t_size stringLite::lastIndexOf(stringp s, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return pfc::string_find_last(ptr(), s, base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 t_size stringLite::indexOfAnyChar(stringp _s, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 string s(_s);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 const t_size len = length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 const char* content = ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 for (t_size walk = base; walk < len; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 if (s.contains(content[walk])) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 return SIZE_MAX;
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 t_size stringLite::lastIndexOfAnyChar(stringp _s, t_size base) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 string s(_s);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 const char* content = ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 for (t_size _walk = min_t<size_t>(base, length()); _walk > 0; --_walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 const t_size walk = _walk - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 if (s.contains(content[walk])) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 bool stringLite::startsWith(char c) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 return (*this)[0] == c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 bool stringLite::startsWith(stringp s) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 const char* walk = ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 const char* subWalk = s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if (*subWalk == 0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (*walk != *subWalk) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 walk++; subWalk++;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 bool stringLite::endsWith(char c) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 const t_size len = length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 if (len == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 return ptr()[len - 1] == c;
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 bool stringLite::endsWith(stringp s) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 const t_size len = length(), subLen = stringp_length(s);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 if (subLen > len) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 return subString(len - subLen) == s;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 char stringLite::firstChar() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 return (*this)[0];
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 char stringLite::lastChar() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 const t_size len = length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 return len > 0 ? (*this)[len - 1] : (char)0;
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 bool stringLite::contains(char c) const { return indexOf(c) != SIZE_MAX; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 bool stringLite::contains(stringp s) const { return indexOf(s) != SIZE_MAX; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 bool stringLite::containsAnyChar(stringp s) const { return indexOfAnyChar(s) != SIZE_MAX; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 stringLite stringLite::replace(stringp strOld, stringp strNew) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 stringLite ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 size_t status = this->replace_string_ex(ret, strOld, strNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if (status == 0) ret = *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 stringLite stringLite::trim(char c) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 size_t base = 0, end = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 const char* p = c_str();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 size_t walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 while (p[walk] == c) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 base = end = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 while (p[walk] != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 if (p[walk] != c) end = walk + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 stringLite ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 ret.set_string_nc(p + base, end - base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 bool stringLite::operator==(const stringLite& other) const noexcept { return equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 bool stringLite::operator!=(const stringLite& other) const noexcept { return !equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 bool stringLite::operator==(const char* other) const noexcept { return strcmp(c_str(), other) == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 bool stringLite::operator!=(const char* other) const noexcept { return strcmp(c_str(), other) != 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 bool stringLite::operator>(const stringLite& other) const noexcept { return greater(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 bool stringLite::operator<(const stringLite& other) const noexcept { return greater(other, *this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 bool stringLite::operator>(const char* other) const noexcept { return greater(m_ptr, m_length, other, strlen(other)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 bool stringLite::operator<(const char* other) const noexcept { return greater(other, strlen(other), m_ptr, m_length); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 bool stringLite::operator>=(const stringLite& other) const noexcept { return !greater(other, *this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 bool stringLite::operator<=(const stringLite& other) const noexcept { return !greater(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 bool stringLite::operator>=(const char* other) const noexcept { return !greater(other, strlen(other), m_ptr, m_length); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 bool stringLite::operator<=(const char* other) const noexcept { return !greater(m_ptr, m_length, other, strlen(other)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347