lib/utils: small cleanups
Fix some static analysis warnings
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright (C) 2020-2023 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
** Copyright (C) 2020-2026 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
**
|
**
|
||||||
** This program is free software; you can redistribute it and/or modify it
|
** This program is free software; you can redistribute it and/or modify it
|
||||||
** under the terms of the GNU General Public License as published by the
|
** under the terms of the GNU General Public License as published by the
|
||||||
@ -36,8 +36,8 @@ Command::string_vec_arg(const std::string& name) const
|
|||||||
std::vector<std::string> vec;
|
std::vector<std::string> vec;
|
||||||
for (const auto& item : val->list()) {
|
for (const auto& item : val->list()) {
|
||||||
if (!item.stringp()) {
|
if (!item.stringp()) {
|
||||||
// mu_warning("command: non-string in string-list for {}: {}",
|
mu_warning("command: non-string in string-list for {}: {}",
|
||||||
// name, to_string());
|
name, to_string());
|
||||||
return Nothing;
|
return Nothing;
|
||||||
} else
|
} else
|
||||||
vec.emplace_back(item.string());
|
vec.emplace_back(item.string());
|
||||||
@ -63,7 +63,6 @@ validate(const CommandHandler::CommandInfoMap& cmap,
|
|||||||
//
|
//
|
||||||
// so, we're looking for the odd-numbered parameters.
|
// so, we're looking for the odd-numbered parameters.
|
||||||
const auto param_it = cmd.find_arg(argname);
|
const auto param_it = cmd.find_arg(argname);
|
||||||
const auto&& param_val = std::next(param_it);
|
|
||||||
// it's an error when a required parameter is missing.
|
// it's an error when a required parameter is missing.
|
||||||
if (param_it == cmd.cend()) {
|
if (param_it == cmd.cend()) {
|
||||||
if (arginfo.required)
|
if (arginfo.required)
|
||||||
@ -73,6 +72,13 @@ validate(const CommandHandler::CommandInfoMap& cmap,
|
|||||||
continue; // not required
|
continue; // not required
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the keyword is present; its value must follow it.
|
||||||
|
const auto param_val = std::next(param_it);
|
||||||
|
if (param_val == cmd.cend())
|
||||||
|
return Err(Error::Code::Command,
|
||||||
|
"missing value for parameter {} in command '{}'",
|
||||||
|
argname, cmd.to_string());
|
||||||
|
|
||||||
// the types must match, but the 'nil' symbol is acceptable as "no value"
|
// the types must match, but the 'nil' symbol is acceptable as "no value"
|
||||||
if (param_val->type() != arginfo.type && !(param_val->nilp()))
|
if (param_val->type() != arginfo.type && !(param_val->nilp()))
|
||||||
return Err(Error::Code::Command,
|
return Err(Error::Code::Command,
|
||||||
|
|||||||
@ -112,7 +112,7 @@ public:
|
|||||||
* @return true or false
|
* @return true or false
|
||||||
*/
|
*/
|
||||||
bool looking_at(std::string_view str) const {
|
bool looking_at(std::string_view str) const {
|
||||||
if (pos_ >= html_.size() || pos_ + str.size() >= html_.size())
|
if (pos_ >= html_.size() || pos_ + str.size() > html_.size())
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return matches({html_.data()+pos_, str.size()}, str);
|
return matches({html_.data()+pos_, str.size()}, str);
|
||||||
|
|||||||
@ -89,9 +89,10 @@ Mu::canonicalize_filename(const std::string& path, const std::string& relative_t
|
|||||||
path.c_str(),
|
path.c_str(),
|
||||||
relative_to.empty() ? nullptr : relative_to.c_str())).value()};
|
relative_to.empty() ? nullptr : relative_to.c_str())).value()};
|
||||||
|
|
||||||
// remove trailing '/'... is this needed?
|
if (!str.empty()) { // remove trailing '/'... is this needed?
|
||||||
if (str[str.length()-1] == G_DIR_SEPARATOR)
|
if (str[str.length()-1] == G_DIR_SEPARATOR)
|
||||||
str.erase(str.length() - 1);
|
str.erase(str.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -175,7 +176,6 @@ Mu::read_from_stdin()
|
|||||||
{
|
{
|
||||||
g_autoptr(GOutputStream) outmem = g_memory_output_stream_new_resizable();
|
g_autoptr(GOutputStream) outmem = g_memory_output_stream_new_resizable();
|
||||||
g_autoptr(GInputStream) input = g_unix_input_stream_new(STDIN_FILENO, TRUE);
|
g_autoptr(GInputStream) input = g_unix_input_stream_new(STDIN_FILENO, TRUE);
|
||||||
//g_autoptr(GCancellable) cancel{maybe_cancellable_timeout(timeout)};
|
|
||||||
|
|
||||||
GError *err{};
|
GError *err{};
|
||||||
auto bytes = g_output_stream_splice(outmem, input,
|
auto bytes = g_output_stream_splice(outmem, input,
|
||||||
|
|||||||
@ -552,9 +552,8 @@ Mu::parse_size(const std::string& val, bool is_first)
|
|||||||
minfo = NULL;
|
minfo = NULL;
|
||||||
if (g_regex_match(rx, val.c_str(), (GRegexMatchFlags)0, &minfo)) {
|
if (g_regex_match(rx, val.c_str(), (GRegexMatchFlags)0, &minfo)) {
|
||||||
|
|
||||||
char* s;
|
char* s = g_match_info_fetch(minfo, 1);
|
||||||
s = g_match_info_fetch(minfo, 1);
|
size = atoll(s); // check overflow?
|
||||||
size = atoll(s);
|
|
||||||
g_free(s);
|
g_free(s);
|
||||||
|
|
||||||
s = g_match_info_fetch(minfo, 2);
|
s = g_match_info_fetch(minfo, 2);
|
||||||
@ -676,14 +675,10 @@ Mu::summarize(const std::string& str, size_t max_lines)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
locale_is_utf8 (void)
|
locale_is_utf8 ()
|
||||||
{
|
{
|
||||||
const gchar *dummy;
|
static const bool is_utf8{g_get_charset({}) ? true : false};
|
||||||
static int is_utf8 = -1;
|
return is_utf8;
|
||||||
if (G_UNLIKELY(is_utf8 == -1))
|
|
||||||
is_utf8 = g_get_charset(&dummy) ? 1 : 0;
|
|
||||||
|
|
||||||
return !!is_utf8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
@ -218,7 +218,7 @@ utf8_flatten(const std::string& s) {
|
|||||||
*
|
*
|
||||||
* @return a cleaned-up string.
|
* @return a cleaned-up string.
|
||||||
*/
|
*/
|
||||||
std::string utf8_clean(const std::string& dirty);
|
[[nodiscard]] std::string utf8_clean(const std::string& dirty);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -228,7 +228,7 @@ std::string utf8_clean(const std::string& dirty);
|
|||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
std::string utf8_wordbreak(const std::string& txt);
|
[[nodiscard]] std::string utf8_wordbreak(const std::string& txt);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -239,7 +239,7 @@ std::string utf8_wordbreak(const std::string& txt);
|
|||||||
*
|
*
|
||||||
* @return the string without control characters
|
* @return the string without control characters
|
||||||
*/
|
*/
|
||||||
std::string remove_ctrl(const std::string& str);
|
[[nodiscard]] std::string remove_ctrl(const std::string& str);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split a string in parts. As a special case, splitting an empty string
|
* Split a string in parts. As a special case, splitting an empty string
|
||||||
@ -250,7 +250,8 @@ std::string remove_ctrl(const std::string& str);
|
|||||||
*
|
*
|
||||||
* @return the parts.
|
* @return the parts.
|
||||||
*/
|
*/
|
||||||
std::vector<std::string> split(const std::string& str, const std::string& sepa);
|
[[nodiscard]] std::vector<std::string> split(const std::string& str,
|
||||||
|
const std::string& sepa);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split a string in parts. As a special case, splitting an empty string
|
* Split a string in parts. As a special case, splitting an empty string
|
||||||
@ -271,8 +272,10 @@ std::vector<std::string> split(const std::string& str, char sepa);
|
|||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
std::string join(const std::vector<std::string>& svec, const std::string& sepa);
|
[[nodiscard]] std::string join(const std::vector<std::string>& svec,
|
||||||
static inline std::string join(const std::vector<std::string>& svec, char sepa) {
|
const std::string& sepa);
|
||||||
|
[[nodiscard]] static inline std::string join(const std::vector<std::string>& svec,
|
||||||
|
char sepa) {
|
||||||
return join(svec, std::string(1, sepa));
|
return join(svec, std::string(1, sepa));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +317,7 @@ static inline bool mu_print_encoded(fmt::format_string<T...> frm, T&&... args) n
|
|||||||
*/
|
*/
|
||||||
constexpr ::time_t time_t_min = 0;
|
constexpr ::time_t time_t_min = 0;
|
||||||
constexpr ::time_t time_t_max = std::numeric_limits<::time_t>::max();
|
constexpr ::time_t time_t_max = std::numeric_limits<::time_t>::max();
|
||||||
constexpr ::time_t to_time_t(int64_t t) {
|
[[nodiscard]] constexpr ::time_t to_time_t(int64_t t) {
|
||||||
return std::clamp(t,
|
return std::clamp(t,
|
||||||
static_cast<int64_t>(time_t_min),
|
static_cast<int64_t>(time_t_min),
|
||||||
static_cast<int64_t>(time_t_max));
|
static_cast<int64_t>(time_t_max));
|
||||||
@ -333,7 +336,8 @@ constexpr ::time_t to_time_t(int64_t t) {
|
|||||||
*
|
*
|
||||||
* @return the corresponding time_t or Nothing if parsing failed.
|
* @return the corresponding time_t or Nothing if parsing failed.
|
||||||
*/
|
*/
|
||||||
Option<::time_t> parse_date_time(const std::string& date, bool first, bool use_utc=false);
|
[[nodiscard]] Option<::time_t> parse_date_time(const std::string& date,
|
||||||
|
bool first, bool use_utc=false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crudely convert HTML to plain text. This attempts to scrape the
|
* Crudely convert HTML to plain text. This attempts to scrape the
|
||||||
@ -343,7 +347,7 @@ Option<::time_t> parse_date_time(const std::string& date, bool first, bool use_u
|
|||||||
*
|
*
|
||||||
* @return plain text
|
* @return plain text
|
||||||
*/
|
*/
|
||||||
std::string html_to_text(const std::string& html);
|
[[nodiscard]] std::string html_to_text(const std::string& html);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hack to avoid locale crashes
|
* Hack to avoid locale crashes
|
||||||
|
|||||||
Reference in New Issue
Block a user