Skip to content

Commit 65eeb8e

Browse files
committed
More string cleanup
1 parent 960f727 commit 65eeb8e

File tree

14 files changed

+456
-375
lines changed

14 files changed

+456
-375
lines changed

include/Convert.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace OpenShock::Convert {
1515
void FromUint32(uint32_t val, std::string& str);
1616
void FromInt64(int64_t val, std::string& str);
1717
void FromUint64(uint64_t val, std::string& str);
18+
void FromSizeT(size_t val, std::string& str);
1819
void FromBool(bool val, std::string& str);
1920
void FromGpioNum(gpio_num_t val, std::string& str);
2021

@@ -26,6 +27,7 @@ namespace OpenShock::Convert {
2627
bool ToUint32(std::string_view str, uint32_t& val);
2728
bool ToInt64(std::string_view str, int64_t& val);
2829
bool ToUint64(std::string_view str, uint64_t& val);
30+
bool ToSizeT(std::string_view str, size_t& val);
2931
bool ToBool(std::string_view str, bool& val);
3032
bool ToGpioNum(std::string_view str, gpio_num_t& val);
3133
} // namespace OpenShock::Convert

include/external/AsyncWebServer/ESPAsyncWebServer.h

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ class AsyncWebParameter {
7373
, _isFile(file)
7474
{
7575
}
76-
const std::string& name() const { return _name; }
77-
const std::string& value() const { return _value; }
76+
std::string_view name() const { return _name; }
77+
std::string_view value() const { return _value; }
7878
size_t size() const { return _size; }
7979
bool isPost() const { return _isForm; }
8080
bool isFile() const { return _isFile; }
@@ -101,15 +101,16 @@ class AsyncWebHeader {
101101
{
102102
if (data.empty()) return;
103103

104-
auto index = data.find(':');
105-
if (index == std::string_view::npos) return;
104+
auto pair = OpenShock::StringSplitByFirst(data, ':');
106105

107-
_name = data.substr(0, index);
108-
_value = OpenShock::StringTrim(data.substr(index));
106+
if (pair.first.empty() || pair.second.empty()) return;
107+
108+
_name = pair.first;
109+
_value = pair.second;
109110
}
110111
~AsyncWebHeader() { }
111-
const std::string& name() const { return _name; }
112-
const std::string& value() const { return _value; }
112+
std::string_view name() const { return _name; }
113+
std::string_view value() const { return _value; }
113114
std::string toString() const { return std::string(_name + ": " + _value + "\r\n"); }
114115
};
115116

@@ -186,7 +187,7 @@ class AsyncWebServerRequest {
186187
void _addPathParam(const char* param);
187188

188189
bool _parseReqHead();
189-
bool _parseReqHeader();
190+
bool _parseReqHeader(std::string_view header);
190191
void _parseLine();
191192
void _parsePlainPostChar(uint8_t data);
192193
void _parseMultipartPostByte(uint8_t data, bool last);
@@ -206,9 +207,9 @@ class AsyncWebServerRequest {
206207
AsyncClient* client() { return _client; }
207208
HttpVersion version() const { return _version; }
208209
HttpRequestMethod method() const { return _method; }
209-
const std::string& url() const { return _url; }
210-
const std::string& host() const { return _host; }
211-
const std::string& contentType() const { return _contentType; }
210+
std::string_view url() const { return _url; }
211+
std::string_view host() const { return _host; }
212+
std::string_view contentType() const { return _contentType; }
212213
size_t contentLength() const { return _contentLength; }
213214
bool multipart() const { return _isMultipart; }
214215
const char* methodToString() const;
@@ -228,8 +229,6 @@ class AsyncWebServerRequest {
228229
void send(Stream& stream, std::string_view contentType, size_t len);
229230
void send(std::string_view contentType, size_t len, AwsResponseFiller callback);
230231
void sendChunked(std::string_view contentType, AwsResponseFiller callback);
231-
void send_P(int code, std::string_view contentType, const uint8_t* content, size_t len);
232-
void send_P(int code, std::string_view contentType, PGM_P content);
233232

234233
AsyncWebServerResponse* beginResponse(int code, std::string_view contentType = {}, std::string_view content = {});
235234
AsyncWebServerResponse* beginResponse(FS& fs, std::string_view path, std::string_view contentType = {}, bool download = false);
@@ -238,8 +237,6 @@ class AsyncWebServerRequest {
238237
AsyncWebServerResponse* beginResponse(std::string_view contentType, size_t len, AwsResponseFiller callback);
239238
AsyncWebServerResponse* beginChunkedResponse(std::string_view contentType, AwsResponseFiller callback);
240239
AsyncResponseStream* beginResponseStream(std::string_view contentType, size_t bufferSize = 1460);
241-
AsyncWebServerResponse* beginResponse_P(int code, std::string_view contentType, const uint8_t* content, size_t len);
242-
AsyncWebServerResponse* beginResponse_P(int code, std::string_view contentType, PGM_P content);
243240

244241
size_t headers() const; // get header count
245242
bool hasHeader(std::string_view name) const; // check if header exists
@@ -253,17 +250,17 @@ class AsyncWebServerRequest {
253250
AsyncWebParameter* getParam(std::string_view name, bool post = false, bool file = false) const;
254251
AsyncWebParameter* getParam(size_t num) const;
255252

256-
size_t args() const { return params(); } // get arguments count
257-
const std::string& arg(std::string_view name) const; // get request argument value by name
258-
const std::string& arg(size_t i) const; // get request argument value by number
259-
const std::string& argName(size_t i) const; // get request argument name by number
260-
bool hasArg(const char* name) const; // check if argument exists
253+
size_t args() const { return params(); } // get arguments count
254+
std::string_view arg(std::string_view name) const; // get request argument value by name
255+
std::string_view arg(size_t i) const; // get request argument value by number
256+
std::string_view argName(size_t i) const; // get request argument name by number
257+
bool hasArg(std::string_view name) const; // check if argument exists
261258

262-
const std::string& pathArg(size_t i) const;
259+
std::string_view pathArg(size_t i) const;
263260

264-
const std::string& header(const char* name) const; // get request header value by name
265-
const std::string& header(size_t i) const; // get request header value by number
266-
const std::string& headerName(size_t i) const; // get request header name by number
261+
std::string_view header(std::string_view name) const; // get request header value by name
262+
std::string_view header(size_t i) const; // get request header value by number
263+
std::string_view headerName(size_t i) const; // get request header name by number
267264
std::string urlDecode(std::string_view text) const;
268265
};
269266

@@ -411,7 +408,7 @@ class DefaultHeaders {
411408
public:
412409
using ConstIterator = headers_t::ConstIterator;
413410

414-
void addHeader(const std::string& name, const std::string& value) { _headers.add(new AsyncWebHeader(name, value)); }
411+
void addHeader(std::string_view name, std::string_view value) { _headers.add(new AsyncWebHeader(name, value)); }
415412

416413
ConstIterator begin() const { return _headers.begin(); }
417414
ConstIterator end() const { return _headers.end(); }

include/external/AsyncWebServer/WebHandlerImpl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ class AsyncStaticWebHandler : public AsyncWebHandler {
4444
bool _isDir;
4545

4646
public:
47-
AsyncStaticWebHandler(const char* uri, FS& fs, const char* path, const char* cache_control);
47+
AsyncStaticWebHandler(std::string_view uri, FS& fs, std::string_view path, std::string_view cache_control);
4848
virtual bool canHandle(AsyncWebServerRequest* request) override final;
4949
virtual void handleRequest(AsyncWebServerRequest* request) override final;
5050
AsyncStaticWebHandler& setIsDir(bool isDir);
51-
AsyncStaticWebHandler& setDefaultFile(const char* filename);
51+
AsyncStaticWebHandler& setDefaultFile(std::string_view filename);
5252
AsyncStaticWebHandler& setCacheControl(std::string_view cache_control);
5353
AsyncStaticWebHandler& setSharedEtag(std::string_view etag);
5454
};
@@ -96,7 +96,7 @@ class AsyncCallbackWebHandler : public AsyncWebHandler {
9696

9797
// Match 1 ??
9898
if (OpenShock::StringStartsWith(uri, "/*."sv)) {
99-
uri = uri.substr(uri.find_last_of('.'));
99+
uri = OpenShock::StringAfterLast(uri, '.');
100100

101101
return OpenShock::StringEndsWith(requestUrl, uri);
102102
}

include/external/AsyncWebServer/WebResponseImpl.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,6 @@ class AsyncChunkedResponse : public AsyncAbstractResponse {
112112
virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override;
113113
};
114114

115-
class AsyncProgmemResponse : public AsyncAbstractResponse {
116-
private:
117-
const uint8_t* _content;
118-
size_t _readLength;
119-
120-
public:
121-
AsyncProgmemResponse(int code, std::string_view contentType, const uint8_t* content, size_t len);
122-
bool _sourceValid() const { return true; }
123-
virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override;
124-
};
125-
126115
class cbuf;
127116

128117
class AsyncResponseStream

include/util/StringUtils.h

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <limits>
77
#include <string>
88
#include <string_view>
9+
#include <utility>
910
#include <vector>
1011

1112
namespace OpenShock {
@@ -17,7 +18,7 @@ namespace OpenShock {
1718
}
1819

1920
std::size_t pos = 0;
20-
while (pos < view.size() && isspace(view[pos])) {
21+
while (pos < view.size() && isspace(view[pos]) != 0) {
2122
++pos;
2223
}
2324

@@ -29,7 +30,7 @@ namespace OpenShock {
2930
}
3031

3132
std::size_t pos = view.size() - 1;
32-
while (pos > 0 && isspace(view[pos])) {
33+
while (pos > 0 && isspace(view[pos]) != 0) {
3334
--pos;
3435
}
3536

@@ -38,16 +39,79 @@ namespace OpenShock {
3839
constexpr std::string_view StringTrim(std::string_view view) {
3940
return StringTrimLeft(StringTrimRight(view));
4041
}
42+
43+
constexpr bool StringStartsWith(std::string_view view, char prefix) {
44+
return !view.empty() && view.front() == prefix;
45+
}
4146
constexpr bool StringStartsWith(std::string_view view, std::string_view prefix) {
4247
return view.size() >= prefix.size() && view.substr(0, prefix.size()) == prefix;
4348
}
4449
constexpr bool StringEndsWith(std::string_view view, char suffix)
4550
{
46-
return view.size() >= 1 && view.back() == suffix;
51+
return !view.empty() && view.back() == suffix;
4752
}
4853
constexpr bool StringEndsWith(std::string_view view, std::string_view suffix) {
4954
return view.size() >= suffix.size() && view.substr(view.size() - suffix.size(), view.size()) == suffix;
5055
}
56+
57+
constexpr std::string_view StringRemovePrefix(std::string_view view, char prefix) {
58+
if (StringStartsWith(view, prefix)) view.remove_prefix(1);
59+
return view;
60+
}
61+
constexpr std::string_view StringRemovePrefix(std::string_view view, std::string_view prefix) {
62+
if (StringStartsWith(view, prefix)) view.remove_prefix(prefix.length());
63+
return view;
64+
}
65+
constexpr std::string_view StringRemoveSuffix(std::string_view view, char suffix) {
66+
if (StringStartsWith(view, suffix)) view.remove_suffix(1);
67+
return view;
68+
}
69+
constexpr std::string_view StringRemoveSuffix(std::string_view view, std::string_view suffix) {
70+
if (StringStartsWith(view, suffix)) view.remove_prefix(suffix.length());
71+
return view;
72+
}
73+
74+
constexpr std::string_view StringBeforeFirst(std::string_view view, char delimiter) {
75+
size_t pos = view.find(delimiter);
76+
if (pos == std::string_view::npos) return view;
77+
return view.substr(0, pos);
78+
}
79+
constexpr std::string_view StringBeforeFirst(std::string_view view, std::string_view delimiter) {
80+
size_t pos = view.find(delimiter);
81+
if (pos == std::string_view::npos) return view;
82+
return view.substr(0, pos);
83+
}
84+
constexpr std::string_view StringBeforeLast(std::string_view view, char delimiter) {
85+
size_t pos = view.find_last_of(delimiter);
86+
if (pos == std::string_view::npos) return view;
87+
return view.substr(0, pos);
88+
}
89+
constexpr std::string_view StringBeforeLast(std::string_view view, std::string_view delimiter) {
90+
size_t pos = view.find_last_of(delimiter);
91+
if (pos == std::string_view::npos) return view;
92+
return view.substr(0, pos);
93+
}
94+
constexpr std::string_view StringAfterFirst(std::string_view view, char delimiter) {
95+
size_t pos = view.find(delimiter);
96+
if (pos == std::string_view::npos) return view;
97+
return view.substr(pos + 1);
98+
}
99+
constexpr std::string_view StringAfterFirst(std::string_view view, std::string_view delimiter) {
100+
size_t pos = view.find(delimiter);
101+
if (pos == std::string_view::npos) return view;
102+
return view.substr(pos + delimiter.length());
103+
}
104+
constexpr std::string_view StringAfterLast(std::string_view view, char delimiter) {
105+
size_t pos = view.find_last_of(delimiter);
106+
if (pos == std::string_view::npos) return view;
107+
return view.substr(pos + 1);
108+
}
109+
constexpr std::string_view StringAfterLast(std::string_view view, std::string_view delimiter) {
110+
size_t pos = view.find_last_of(delimiter);
111+
if (pos == std::string_view::npos) return view;
112+
return view.substr(pos + delimiter.length());
113+
}
114+
51115
template<std::size_t N>
52116
constexpr bool TryStringSplit(std::string_view view, char delimiter, std::string_view (&out)[N]) {
53117
std::size_t pos = 0;
@@ -69,8 +133,26 @@ namespace OpenShock {
69133
std::vector<std::string_view> StringSplit(std::string_view view, bool (*predicate)(char delimiter), std::size_t maxSplits = std::numeric_limits<std::size_t>::max());
70134
std::vector<std::string_view> StringSplitNewLines(std::string_view view, std::size_t maxSplits = std::numeric_limits<std::size_t>::max());
71135
std::vector<std::string_view> StringSplitWhiteSpace(std::string_view view, std::size_t maxSplits = std::numeric_limits<std::size_t>::max());
136+
constexpr std::pair<std::string_view, std::string_view> StringSplitByFirst(std::string_view view, char delimiter) {
137+
size_t pos = view.find(delimiter);
138+
return std::make_pair(view.substr(0, pos), pos == std::string_view::npos ? std::string_view() : view.substr(pos + 1));
139+
}
140+
constexpr std::pair<std::string_view, std::string_view> StringSplitByFirst(std::string_view view, std::string_view delimiter) {
141+
size_t pos = view.find(delimiter);
142+
return std::make_pair(view.substr(0, pos), pos == std::string_view::npos ? std::string_view() : view.substr(pos + delimiter.length()));
143+
}
144+
constexpr std::pair<std::string_view, std::string_view> StringSplitByLast(std::string_view view, char delimiter) {
145+
size_t pos = view.find_last_of(delimiter);
146+
return std::make_pair(view.substr(0, pos), pos == std::string_view::npos ? std::string_view() : view.substr(pos + 1));
147+
}
148+
constexpr std::pair<std::string_view, std::string_view> StringSplitByLast(std::string_view view, std::string_view delimiter) {
149+
size_t pos = view.find_last_of(delimiter);
150+
return std::make_pair(view.substr(0, pos), pos == std::string_view::npos ? std::string_view() : view.substr(pos + delimiter.length()));
151+
}
72152

73153
bool StringIEquals(std::string_view a, std::string_view b);
154+
bool StringIContains(std::string_view haystack, std::string_view needle);
155+
bool StringHasPrefixIC(std::string_view view, std::string_view prefix);
74156

75157
String StringToArduinoString(std::string_view view);
76158
} // namespace OpenShock

src/Convert.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,8 @@ constexpr bool spanToST(std::string_view str, T& val)
120120

121121
bool negative = str.front() == '-';
122122
if (negative) {
123-
str = str.substr(1);
124-
if (str.empty()) {
125-
return false;
126-
}
123+
if (str.length() == 1) return false;
124+
str.remove_suffix(1);
127125
}
128126

129127
typename std::make_unsigned<T>::type i = 0;
@@ -183,6 +181,11 @@ void Convert::FromUint64(uint64_t val, std::string& str)
183181
fromT(val, str);
184182
}
185183

184+
void Convert::FromSizeT(size_t val, std::string& str)
185+
{
186+
fromT(val, str);
187+
}
188+
186189
void Convert::FromBool(bool val, std::string& str)
187190
{
188191
if (val) {
@@ -229,6 +232,10 @@ bool Convert::ToUint64(std::string_view str, uint64_t& val)
229232
{
230233
return spanToUT(str, val);
231234
}
235+
bool Convert::ToSizeT(std::string_view str, size_t& val)
236+
{
237+
return spanToUT(str, val);
238+
}
232239
bool Convert::ToBool(std::string_view str, bool& val)
233240
{
234241
if (str.length() > 5) {
@@ -331,7 +338,7 @@ static_assert(test_spanToUT64Overflow(), "test_spanToUT64Overflow failed");
331338
constexpr bool test_spanToST8()
332339
{
333340
int8_t i8 = 0;
334-
return spanToST("-127"sv, i8) && i8 == -127;
341+
return spanToST("-128"sv, i8) && i8 == -128;
335342
}
336343

337344
static_assert(test_spanToST8(), "test_spanToST8 failed");
@@ -347,7 +354,7 @@ static_assert(test_spanToST16(), "test_spanToST16 failed");
347354
constexpr bool test_spanToST32()
348355
{
349356
int32_t i32 = 0;
350-
return spanToST("-2147483647"sv, i32) && i32 == -2'147'483'647;
357+
return spanToST("-2147483648"sv, i32) && i32 == -2'147'483'648;
351358
}
352359

353360
static_assert(test_spanToST32(), "test_spanToST32 failed");

src/OtaUpdateManager.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -639,9 +639,7 @@ bool OtaUpdateManager::TryGetFirmwareRelease(const OpenShock::SemVer& version, F
639639
auto hash = OpenShock::StringTrim(parts[0]);
640640
auto file = OpenShock::StringTrim(parts[1]);
641641

642-
if (OpenShock::StringStartsWith(file, "./"sv)) {
643-
file = file.substr(2);
644-
}
642+
file = OpenShock::StringRemovePrefix(file, "./"sv);
645643

646644
if (hash.size() != 64) {
647645
OS_LOGE(TAG, "Invalid hash: %.*s", hash.size(), hash.data());

0 commit comments

Comments
 (0)