diff --git a/src/common/HTTP_Server.cpp b/src/common/HTTP_Server.cpp index a49e1cd..bafd205 100644 --- a/src/common/HTTP_Server.cpp +++ b/src/common/HTTP_Server.cpp @@ -473,7 +473,7 @@ int Jupiter::HTTP::Server::Data::process_request(HTTPSession &session) { result += "Server: "_jrs JUPITER_VERSION ENDL; - result += Jupiter::StringS::Format("Content-Length: %u" ENDL, content_result->size()); + result += string_printf("Content-Length: %u" ENDL, content_result->size()); if (session.keep_alive) result += "Connection: keep-alive"_jrs ENDL; diff --git a/src/common/IRC_Client.cpp b/src/common/IRC_Client.cpp index 79eec7c..fa47997 100644 --- a/src/common/IRC_Client.cpp +++ b/src/common/IRC_Client.cpp @@ -329,33 +329,33 @@ void Jupiter::IRC::Client::setAutoReconnect(int val) { } void Jupiter::IRC::Client::joinChannel(std::string_view in_channel) { - m_socket->send(Jupiter::StringS::Format("JOIN %.*s" ENDL, in_channel.size(), in_channel.data())); + m_socket->send(string_printf("JOIN %.*s" ENDL, in_channel.size(), in_channel.data())); } void Jupiter::IRC::Client::joinChannel(std::string_view in_channel, std::string_view in_password) { - m_socket->send(Jupiter::StringS::Format("JOIN %.*s %.*s" ENDL, in_channel.size(), in_channel.data(), in_password.size(), in_password.data())); + m_socket->send(string_printf("JOIN %.*s %.*s" ENDL, in_channel.size(), in_channel.data(), in_password.size(), in_password.data())); } void Jupiter::IRC::Client::partChannel(std::string_view in_channel) { - m_socket->send(Jupiter::StringS::Format("PART %.*s" ENDL, in_channel.size(), in_channel.data())); + m_socket->send(string_printf("PART %.*s" ENDL, in_channel.size(), in_channel.data())); Jupiter::ReferenceString channel_name = in_channel; m_channels[channel_name].setType(-2); } void Jupiter::IRC::Client::partChannel(std::string_view in_channel, std::string_view in_message) { - m_socket->send(Jupiter::StringS::Format("PART %.*s :%.*s" ENDL, in_channel.size(), in_channel.data(), in_message.size(), in_message.data())); + m_socket->send(string_printf("PART %.*s :%.*s" ENDL, in_channel.size(), in_channel.data(), in_message.size(), in_message.data())); Jupiter::ReferenceString channel_name = in_channel; m_channels[channel_name].setType(-2); } void Jupiter::IRC::Client::sendMessage(std::string_view dest, std::string_view message) { - m_socket->send(Jupiter::StringS::Format("PRIVMSG %.*s :%.*s" ENDL, dest.size(), dest.data(), message.size(), message.data())); + m_socket->send(string_printf("PRIVMSG %.*s :%.*s" ENDL, dest.size(), dest.data(), message.size(), message.data())); } void Jupiter::IRC::Client::sendNotice(std::string_view dest, std::string_view message) { - m_socket->send(Jupiter::StringS::Format("NOTICE %.*s :%.*s" ENDL, dest.size(), dest.data(), message.size(), message.data())); + m_socket->send(string_printf("NOTICE %.*s :%.*s" ENDL, dest.size(), dest.data(), message.size(), message.data())); } size_t Jupiter::IRC::Client::messageChannels(int type, std::string_view message) { @@ -670,20 +670,20 @@ int Jupiter::IRC::Client::process_line(std::string_view line) { break; case Reply::LUSERCLIENT: // 251 { - Jupiter::StringL key = "RawData."; - size_t offset; + std::string key = "RawData."; + size_t offset = key.size(); unsigned int i = 1; Jupiter::ReferenceString value; auto config_loop_condition = [&] { - offset = key.aformat("%u", i); + key += std::to_string(i); value = Jupiter::IRC::Client::readConfigValue(key); return !value.empty(); }; while (config_loop_condition()) { - key.truncate(offset); + key.erase(offset); Jupiter::IRC::Client::send(value); i++; } @@ -1066,7 +1066,7 @@ int Jupiter::IRC::Client::process_line(std::string_view line) { { if (w1 == "PING"sv) { - m_socket->send(Jupiter::StringS::Format("PONG %.*s" ENDL, first_split.second.size(), first_split.second.data())); + m_socket->send(string_printf("PONG %.*s" ENDL, first_split.second.size(), first_split.second.data())); } else if (w1 == "NICK"sv) { @@ -1163,7 +1163,7 @@ void Jupiter::IRC::Client::disconnect(bool stayDead) void Jupiter::IRC::Client::disconnect(std::string_view message, bool stayDead) { - m_socket->send(Jupiter::StringS::Format("QUIT :%.*s" ENDL, message.size(), message.data())); + m_socket->send(string_printf("QUIT :%.*s" ENDL, message.size(), message.data())); Jupiter::IRC::Client::disconnect(stayDead); } @@ -1405,16 +1405,14 @@ bool Jupiter::IRC::Client::startCAP() { bool Jupiter::IRC::Client::registerClient() { bool result = true; const char *localHostname = Jupiter::Socket::getLocalHostname(); - Jupiter::StringS messageToSend; - - messageToSend.format("USER %.*s %s %.*s :%.*s" ENDL, m_nickname.size(), m_nickname.data(), localHostname, m_server_hostname.size(), m_server_hostname.c_str(), m_realname.size(), m_realname.data()); + std::string message = string_printf("USER %.*s %s %.*s :%.*s" ENDL, m_nickname.size(), m_nickname.data(), localHostname, m_server_hostname.size(), m_server_hostname.c_str(), m_realname.size(), m_realname.data()); - if (m_socket->send(messageToSend) <= 0) + if (m_socket->send(message) <= 0) result = false; - messageToSend.format("NICK %.*s" ENDL, m_nickname.size(), m_nickname.data()); + message = string_printf("NICK %.*s" ENDL, m_nickname.size(), m_nickname.data()); - if (m_socket->send(messageToSend) <= 0) + if (m_socket->send(message) <= 0) result = false; m_connection_status = 3; diff --git a/src/include/Jupiter/Readable_String.h b/src/include/Jupiter/Readable_String.h index 297276a..f6b7374 100644 --- a/src/include/Jupiter/Readable_String.h +++ b/src/include/Jupiter/Readable_String.h @@ -160,15 +160,13 @@ namespace Jupiter { } } -inline std::string string_printf(const char* format, ...) { +inline std::string vstring_printf(const char* format, va_list args) { std::string result; - va_list args; - va_start(args, format); va_list args_copy; va_copy(args_copy, args); int min_length = std::vsnprintf(nullptr, 0, format, args_copy); - va_end(args_copy); + va_end(args_copy); if (min_length > 0) { result.resize(min_length); @@ -182,6 +180,15 @@ inline std::string string_printf(const char* format, ...) { } } + return result; +} + +inline std::string string_printf(const char* format, ...) { + va_list args; + va_start(args, format); + + std::string result = vstring_printf(format, args); + va_end(args); return result; } diff --git a/src/include/Jupiter/String.hpp b/src/include/Jupiter/String.hpp index 5d81cc7..c421119 100644 --- a/src/include/Jupiter/String.hpp +++ b/src/include/Jupiter/String.hpp @@ -47,36 +47,6 @@ namespace Jupiter { public: - /** - * @brief Sets the String's contents based on the format string and input variables. - * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. - * - * @param format Format that the string is compared against. - * @param args Inputs to match the format specifiers. - * @return Number of characters written. - */ - size_t vformat(const T *format, va_list args); - - /** - * @brief Appends to a String's contents based on the format string and input variables. - * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. - * - * @param format Format that the string is compared against. - * @param args Inputs to match the format specifiers. - * @return Number of characters written. - */ - size_t avformat(const T *format, va_list args); - - /** - * @brief Sets the String's contents based on the format string and input variables. - * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. - * - * @param format Format that the string is compared against. - * @param ... Inputs to match the format specifiers. - * @return String containing the new format. - */ - static String_Strict Format(const T *format, ...); - /** * @brief Creates a partial copy of the string. * diff --git a/src/include/Jupiter/String_Imp.h b/src/include/Jupiter/String_Imp.h index 79fad34..9fbce54 100644 --- a/src/include/Jupiter/String_Imp.h +++ b/src/include/Jupiter/String_Imp.h @@ -26,29 +26,6 @@ #include "String.hpp" -#if !defined va_copy - -#if defined __INTEL_COMPILER -#pragma message("Warning: va_copy not properly defined. Assuming common implementation.") -#define va_copy(dst, src) ((void)((dst) = (src))) -#else -#error "va_copy not defined." -#endif // __INTEL_COMPILER - -#endif // va_copy - -#if !defined JUPITER_VSCPRINTF - -#if defined _WIN32 -#define JUPITER_VSCPRINTF(format, format_args) _vscprintf(format, format_args) -#define JUPITER_VSCWPRINTF(format, format_args) _vscwprintf(format, format_args) -#else // _WIN32 -#define JUPITER_VSCPRINTF(format, format_args) vsnprintf(nullptr, 0, format, format_args) -#define JUPITER_VSCWPRINTF(format, format_args) vswprintf(nullptr, 0, format, format_args) -#endif // _WIN32 - -#endif // JUPITER_VSCPRINTF - /** * IMPLEMENTATION: * String_Strict @@ -170,92 +147,6 @@ template Jupiter::String_Strict::String_Strict(const Jupiter::Rea Jupiter::String_Type::str = Jupiter::Shift_String_Type::base; } -// vformat() - -template<> size_t inline Jupiter::String_Strict::vformat(const char *format, va_list args) -{ - int minLen; - va_list sargs; - va_copy(sargs, args); - minLen = JUPITER_VSCPRINTF(format, sargs); - va_end(sargs); - if (minLen < 0) return 0; // We simply can not work with this. - - this->setBufferSizeNoCopy(minLen + 1); // vsnprintf REQUIRES space for an additional null character. - minLen = vsnprintf(Jupiter::String_Type::str, minLen + 1, format, args); - if (minLen < 0) return 0; - return Jupiter::String_Type::length = minLen; -} - -template<> size_t inline Jupiter::String_Strict::vformat(const wchar_t *format, va_list args) -{ - int minLen; - va_list sargs; - va_copy(sargs, args); - minLen = JUPITER_VSCWPRINTF(format, sargs); - va_end(sargs); - if (minLen < 0) return 0; // We simply can not work with this. - - this->setBufferSizeNoCopy(minLen + 1); // vsnprintf REQUIRES space for an additional null character. - minLen = vswprintf(Jupiter::String_Type::str, minLen + 1, format, args); - if (minLen < 0) return 0; - return Jupiter::String_Type::length = minLen; -} - -template size_t Jupiter::String_Strict::vformat(const T *format, va_list args) -{ - return 0; -} - -// avformat() - -template<> size_t inline Jupiter::String_Strict::avformat(const char *format, va_list args) -{ - int minLen; - va_list sargs; - va_copy(sargs, args); - minLen = JUPITER_VSCPRINTF(format, sargs); - va_end(sargs); - if (minLen < 0) return 0; // We simply can not work with this. - - this->setBufferSize(Jupiter::String_Type::length + minLen + 1); // vsnprintf REQUIRES space for an additional null character. - minLen = vsnprintf(Jupiter::String_Type::str + Jupiter::String_Type::length, minLen + 1, format, args); - if (minLen <= 0) return 0; - Jupiter::String_Type::length += minLen; - return minLen; -} - -template<> size_t inline Jupiter::String_Strict::avformat(const wchar_t *format, va_list args) -{ - int minLen; - va_list sargs; - va_copy(sargs, args); - minLen = JUPITER_VSCWPRINTF(format, sargs); - va_end(sargs); - if (minLen < 0) return 0; // We simply can not work with this. - this->setBufferSize(minLen + Jupiter::String_Type::length + 1); // vsnprintf REQUIRES space for an additional null character. - - minLen = vswprintf(Jupiter::String_Type::str + Jupiter::String_Type::length, minLen + 1, format, args); - if (minLen <= 0) return 0; - Jupiter::String_Type::length += minLen; - return minLen; -} - -template size_t Jupiter::String_Strict::avformat(const T *format, va_list args) -{ - return 0; -} - -template Jupiter::String_Strict Jupiter::String_Strict::Format(const T *format, ...) -{ - String_Strict r; - va_list args; - va_start(args, format); - r.vformat(format, args); - va_end(args); - return r; -} - template typename Jupiter::String_Strict Jupiter::String_Strict::substring(size_t pos) const { return Jupiter::String_Strict::substring(*this, pos); diff --git a/src/include/Jupiter/String_Type.h b/src/include/Jupiter/String_Type.h index e7339a7..4b02435 100644 --- a/src/include/Jupiter/String_Type.h +++ b/src/include/Jupiter/String_Type.h @@ -70,30 +70,6 @@ namespace Jupiter */ const T *data() const; - /** - * @brief Sets the String's contents based on the format string and input variables. - * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. - * - * @param format Format that the string is compared against. - * @param ... Inputs to match the format specifiers. - * @return Number of characters written. - */ - size_t format(const std::basic_string &format, ...); - size_t format(const T *format, ...); - virtual size_t vformat(const T *format, va_list args) = 0; - - /** - * @brief Appends to a String's contents based on the format string and input variables. - * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. - * - * @param format Format that the string is compared against. - * @param ... Inputs to match the format specifiers. - * @return Number of characters written. - */ - size_t aformat(const std::basic_string &format, ...); - size_t aformat(const T *format, ...); - virtual size_t avformat(const T *format, va_list args) = 0; - /** * @brief Truncates the string by a specified number of elements. * diff --git a/src/include/Jupiter/String_Type_Imp.h b/src/include/Jupiter/String_Type_Imp.h index 16447a5..bc9c5c5 100644 --- a/src/include/Jupiter/String_Type_Imp.h +++ b/src/include/Jupiter/String_Type_Imp.h @@ -56,52 +56,6 @@ template const T *Jupiter::String_Type::data() const return Jupiter::String_Type::str; } -// format forwards - -template size_t Jupiter::String_Type::format(const std::basic_string &format, ...) -{ - const char *ptr = format.c_str(); - size_t r; - va_list args; - va_start(args, ptr); - r = this->vformat(ptr, args); - va_end(args); - return r; -} - -template size_t Jupiter::String_Type::format(const T *format, ...) -{ - size_t r; - va_list args; - va_start(args, format); - r = this->vformat(format, args); - va_end(args); - return r; -} - -// aformat forwards - -template size_t Jupiter::String_Type::aformat(const std::basic_string &format, ...) -{ - const char *ptr = format.c_str(); - size_t r; - va_list args; - va_start(args, ptr); - r = this->avformat(ptr, args); - va_end(args); - return r; -} - -template size_t Jupiter::String_Type::aformat(const T *format, ...) -{ - size_t r; - va_list args; - va_start(args, format); - r = this->avformat(format, args); - va_end(args); - return r; -} - // truncate base template size_t Jupiter::String_Type::truncate(size_t n)