Skip to content

Commit 2d120c9

Browse files
committed
use loop instead of regex
1 parent d131ddb commit 2d120c9

File tree

1 file changed

+14
-21
lines changed

1 file changed

+14
-21
lines changed

llvm/lib/Support/StringExtras.cpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212

1313
#include "llvm/ADT/StringExtras.h"
1414
#include "llvm/ADT/SmallVector.h"
15-
#include "llvm/Support/ErrorHandling.h"
16-
#include "llvm/Support/Regex.h"
1715
#include "llvm/Support/raw_ostream.h"
1816
#include <cctype>
1917

@@ -98,26 +96,21 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
9896
if (input.empty())
9997
return "";
10098

101-
llvm::Regex trailingCap = llvm::Regex("([A-Z]+)([A-Z][a-z])");
102-
llvm::Regex leadingCap = llvm::Regex("([a-z0-9])([A-Z])");
103-
104-
std::string curr = input.str();
105-
std::string prev = input.str();
106-
size_t iters = 0;
107-
do {
108-
prev = curr;
109-
curr = trailingCap.sub("\\1_\\2", prev);
110-
curr = leadingCap.sub("\\1_\\2", curr);
111-
} while (curr != prev && ++iters < input.size());
112-
113-
if (iters == input.size())
114-
llvm::report_fatal_error(
115-
input + Twine(" couldn't be converted to snake case after ") +
116-
Twine(iters) + Twine("iterations."));
117-
118-
std::transform(curr.begin(), curr.end(), curr.begin(),
99+
std::string snakeCase;
100+
snakeCase.reserve(input.size());
101+
auto check = [&input](size_t j, std::function<bool(int)> check) {
102+
return j < input.size() ? check(input[j]) : false;
103+
};
104+
for (size_t i = 0; i < input.size(); ++i) {
105+
snakeCase.push_back(input[i]);
106+
if (check(i, isupper) && check(i + 1, isupper) && check(i + 2, islower))
107+
snakeCase.push_back('_');
108+
if ((check(i, islower) || check(i, isdigit)) && check(i + 1, isupper))
109+
snakeCase.push_back('_');
110+
}
111+
std::transform(snakeCase.begin(), snakeCase.end(), snakeCase.begin(),
119112
[](unsigned char c) { return std::tolower(c); });
120-
return curr;
113+
return snakeCase;
121114
}
122115

123116
std::string llvm::convertToCamelFromSnakeCase(StringRef input,

0 commit comments

Comments
 (0)