blob: cdafcc5444cde6d867ebe556382f4f69f110f811 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "../string_util.h"
#include <string>
#include <string_view>
#include "fillins_string_util.h"
namespace bssl {
namespace fillins {
// TODO(bbe): get rid of this
std::string HexEncode(const void *bytes, size_t size) {
return bssl::string_util::HexEncode((const uint8_t *)bytes, size);
}
static bool IsUnicodeWhitespace(char c) {
return c == 9 || c == 10 || c == 11 || c == 12 || c == 13 || c == ' ';
}
std::string CollapseWhitespaceASCII(std::string_view text,
bool trim_sequences_with_line_breaks) {
std::string result;
result.resize(text.size());
// Set flags to pretend we're already in a trimmed whitespace sequence, so we
// will trim any leading whitespace.
bool in_whitespace = true;
bool already_trimmed = true;
int chars_written = 0;
for (auto i = text.begin(); i != text.end(); ++i) {
if (IsUnicodeWhitespace(*i)) {
if (!in_whitespace) {
// Reduce all whitespace sequences to a single space.
in_whitespace = true;
result[chars_written++] = L' ';
}
if (trim_sequences_with_line_breaks && !already_trimmed &&
((*i == '\n') || (*i == '\r'))) {
// Whitespace sequences containing CR or LF are eliminated entirely.
already_trimmed = true;
--chars_written;
}
} else {
// Non-whitespace chracters are copied straight across.
in_whitespace = false;
already_trimmed = false;
result[chars_written++] = *i;
}
}
if (in_whitespace && !already_trimmed) {
// Any trailing whitespace is eliminated.
--chars_written;
}
result.resize(chars_written);
return result;
}
// TODO(bbe): get rid of this (used to be strcasecmp in google3, which
// causes windows pain because msvc and strings.h)
bool EqualsCaseInsensitiveASCII(std::string_view a, std::string_view b) {
return bssl::string_util::IsEqualNoCase(a, b);
}
bool IsAsciiAlpha(char c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}
bool IsAsciiDigit(char c) { return c >= '0' && c <= '9'; }
void ReplaceSubstringsAfterOffset(std::string *s, size_t offset,
std::string_view find,
std::string_view replace) {
std::string_view prefix(s->data(), offset);
std::string suffix =
bssl::string_util::FindAndReplace(s->substr(offset), find, replace);
*s = std::string(prefix) + suffix;
};
} // namespace fillins
} // namespace bssl