mirror of
https://github.com/open-goal/jak-project
synced 2026-05-23 06:54:31 -04:00
dd0a8a17b2
- started documenting the files I glossed over, some are totally done, others are just partially done - I changed the decompiler to automatically initialize the art-group-info from the json file. This makes updating gsrc, even a single file at a time, have consistent naming - Though I disabled this functionality for jak 1, as I have no idea if using the ntsc art groups will cause a regression for different versions - fix indentation for docstrings -- it still doesn't look great, but this is now a formatting concern, rather than the docstring having a bunch of happen-stance leading whitespace.
88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
#include "string_util.h"
|
|
|
|
#include <regex>
|
|
|
|
#include "common/util/diff.h"
|
|
|
|
namespace str_util {
|
|
|
|
const std::string WHITESPACE = " \n\r\t\f\v";
|
|
|
|
bool contains(const std::string& s, const std::string& substr) {
|
|
return s.find(substr) != std::string::npos;
|
|
}
|
|
|
|
bool starts_with(const std::string& s, const std::string& prefix) {
|
|
return s.rfind(prefix) == 0;
|
|
}
|
|
|
|
bool ends_with(const std::string& s, const std::string& suffix) {
|
|
if (s.length() >= suffix.length()) {
|
|
return !s.compare(s.length() - suffix.length(), suffix.length(), suffix);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
std::string ltrim(const std::string& s) {
|
|
size_t start = s.find_first_not_of(WHITESPACE);
|
|
return (start == std::string::npos) ? "" : s.substr(start);
|
|
}
|
|
|
|
std::string rtrim(const std::string& s) {
|
|
size_t end = s.find_last_not_of(WHITESPACE);
|
|
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
|
|
}
|
|
|
|
std::string trim(const std::string& s) {
|
|
return rtrim(ltrim(s));
|
|
}
|
|
|
|
std::string trim_newline_indents(const std::string& s) {
|
|
auto lines = split(s, '\n');
|
|
std::vector<std::string> trimmed_lines;
|
|
std::transform(lines.begin(), lines.end(), std::back_inserter(trimmed_lines),
|
|
[](const std::string& line) { return ltrim(line); });
|
|
return join(trimmed_lines, "\n");
|
|
}
|
|
|
|
std::string join(const std::vector<std::string>& strs, const std::string& join_with) {
|
|
std::string out;
|
|
for (int i = 0; i < strs.size(); i++) {
|
|
out += strs.at(i);
|
|
if (i < strs.size() - 1) {
|
|
out += join_with;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
int line_count(const std::string& str) {
|
|
int result = 0;
|
|
for (auto& c : str) {
|
|
if (c == '\n') {
|
|
result++;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// NOTE - this won't work running within gk.exe!
|
|
bool valid_regex(const std::string& regex) {
|
|
try {
|
|
std::regex re(regex);
|
|
} catch (const std::regex_error& e) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::string diff(const std::string& lhs, const std::string& rhs) {
|
|
return google_diff::diff_strings(lhs, rhs);
|
|
}
|
|
/// Default splits on \n characters
|
|
std::vector<std::string> split(const ::std::string& str, char delimiter) {
|
|
return google_diff::split_string(str, delimiter);
|
|
}
|
|
} // namespace str_util
|