Skip to content

Commit d131ddb

Browse files
committed
make fixed-point
1 parent f005c3b commit d131ddb

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

llvm/lib/Support/StringExtras.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "llvm/ADT/StringExtras.h"
1414
#include "llvm/ADT/SmallVector.h"
15+
#include "llvm/Support/ErrorHandling.h"
1516
#include "llvm/Support/Regex.h"
1617
#include "llvm/Support/raw_ostream.h"
1718
#include <cctype>
@@ -100,14 +101,23 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
100101
llvm::Regex trailingCap = llvm::Regex("([A-Z]+)([A-Z][a-z])");
101102
llvm::Regex leadingCap = llvm::Regex("([a-z0-9])([A-Z])");
102103

103-
std::string snakeCase = input.str();
104-
for (int i = 0; i < 10; ++i) {
105-
snakeCase = trailingCap.sub("\\1_\\2", snakeCase);
106-
snakeCase = leadingCap.sub("\\1_\\2", snakeCase);
107-
}
108-
std::transform(snakeCase.begin(), snakeCase.end(), snakeCase.begin(),
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(),
109119
[](unsigned char c) { return std::tolower(c); });
110-
return snakeCase;
120+
return curr;
111121
}
112122

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

0 commit comments

Comments
 (0)