From 75185185f124af98d3189e8530e919033c638901 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sat, 30 May 2015 11:43:52 -0400 Subject: [PATCH] Added isNotEmpty() to Readable_String. Modified instances of size() == 0 and size() != 0 to isEmpty() and isNotEmpty(), as appropriate. --- Jupiter/File.cpp | 10 ++-- Jupiter/INIFile.cpp | 43 +++++++-------- Jupiter/IRC_Client.cpp | 95 ++++++++++++++++++---------------- Jupiter/Readable_String.h | 7 +++ Jupiter/Readable_String_Imp.h | 36 +++++++++---- Jupiter/SecureSocket.cpp | 3 +- Jupiter/String_Type_Imp.h | 2 +- Release/Jupiter.lib | Bin 268568 -> 268568 bytes 8 files changed, 113 insertions(+), 83 deletions(-) diff --git a/Jupiter/File.cpp b/Jupiter/File.cpp index a282342..e946f52 100644 --- a/Jupiter/File.cpp +++ b/Jupiter/File.cpp @@ -110,7 +110,7 @@ bool Jupiter::File::load(const char *file) { FILE *filePtr = fopen(file, "rb"); if (filePtr == nullptr) return false; - if (Jupiter::File::data_->fileName.size() == 0) + if (Jupiter::File::data_->fileName.isEmpty()) Jupiter::File::data_->fileName = file; bool r = Jupiter::File::load(filePtr); fclose(filePtr); @@ -122,7 +122,7 @@ bool Jupiter::File::load(const Jupiter::ReadableString &file) Jupiter::CStringS fileName = file; FILE *filePtr = fopen(fileName.c_str(), "rb"); if (filePtr == nullptr) return false; - if (Jupiter::File::data_->fileName.size() == 0) + if (Jupiter::File::data_->fileName.isEmpty()) Jupiter::File::data_->fileName = file; bool r = Jupiter::File::load(filePtr); fclose(filePtr); @@ -178,7 +178,8 @@ void Jupiter::File::unload() bool Jupiter::File::reload() { - if (Jupiter::File::data_->fileName.size() == 0) return false; + if (Jupiter::File::data_->fileName.isEmpty()) + return false; Jupiter::CStringS fileName(std::move(Jupiter::File::data_->fileName)); Jupiter::File::unload(); return Jupiter::File::load(fileName.c_str()); @@ -204,7 +205,8 @@ bool Jupiter::File::reload(FILE *file) bool Jupiter::File::sync() { - if (Jupiter::File::data_->fileName.size() == 0) return false; + if (Jupiter::File::data_->fileName.isEmpty()) + return false; return Jupiter::File::sync(Jupiter::File::data_->fileName.c_str()); } diff --git a/Jupiter/INIFile.cpp b/Jupiter/INIFile.cpp index 8757b1e..6b8ca7b 100644 --- a/Jupiter/INIFile.cpp +++ b/Jupiter/INIFile.cpp @@ -144,7 +144,7 @@ const Jupiter::ReadableString &Jupiter::INIFile::Section::get(const Jupiter::Rea bool Jupiter::INIFile::Section::getBool(const Jupiter::ReadableString &key, bool defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asBool(); return defaultValue; } @@ -157,7 +157,7 @@ short Jupiter::INIFile::Section::getShort(const Jupiter::ReadableString &key, sh int Jupiter::INIFile::Section::getInt(const Jupiter::ReadableString &key, int defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asInt(); return defaultValue; } @@ -165,7 +165,7 @@ int Jupiter::INIFile::Section::getInt(const Jupiter::ReadableString &key, int de long Jupiter::INIFile::Section::getLong(const Jupiter::ReadableString &key, long defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asInt(); return defaultValue; } @@ -173,7 +173,7 @@ long Jupiter::INIFile::Section::getLong(const Jupiter::ReadableString &key, long long long Jupiter::INIFile::Section::getLongLong(const Jupiter::ReadableString &key, long long defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asLongLong(); return defaultValue; } @@ -181,7 +181,7 @@ long long Jupiter::INIFile::Section::getLongLong(const Jupiter::ReadableString & float Jupiter::INIFile::Section::getFloat(const Jupiter::ReadableString &key, float defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return float(val.asDouble()); return defaultValue; } @@ -189,7 +189,7 @@ float Jupiter::INIFile::Section::getFloat(const Jupiter::ReadableString &key, fl double Jupiter::INIFile::Section::getDouble(const Jupiter::ReadableString &key, double defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asDouble(); return defaultValue; } @@ -197,7 +197,7 @@ double Jupiter::INIFile::Section::getDouble(const Jupiter::ReadableString &key, long double Jupiter::INIFile::Section::getLongDouble(const Jupiter::ReadableString &key, long double defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::Section::get(key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asDouble(); return defaultValue; } @@ -338,11 +338,11 @@ unsigned int Jupiter::INIFile::readFile(const char *fileName) line = file.getLine(index); // check if line is a comment. - while (line.size() != 0 && isspace(line.get(0))) + while (line.isNotEmpty() && isspace(line.get(0))) line.shiftRight(1); - if (line.size() == 0) continue; // Completely whitespace. - if (line.get(0) == ';') continue; // Comment. + if (line.isEmpty() || line.get(0) == ';') + continue; while (isspace(line.get(line.size() - 1))) // This is safe due to the previous check, which confirms that there is a non-whitespace character. line.truncate(1); @@ -352,7 +352,7 @@ unsigned int Jupiter::INIFile::readFile(const char *fileName) line.shiftRight(1); // Truncate up to the last ']'. - while (line.size() != 0 && line.get(line.size() - 1) != ']') + while (line.isNotEmpty() && line.get(line.size() - 1) != ']') line.truncate(1); line.truncate(1); // Truncate the ']' we stoped at. @@ -362,10 +362,10 @@ unsigned int Jupiter::INIFile::readFile(const char *fileName) { Jupiter::ReferenceString key = line.getWord(0, "="); Jupiter::ReferenceString value = line.substring(key.size() + 1); - while (key.size() != 0 && isspace(key.get(key.size() - 1))) + while (key.isNotEmpty() && isspace(key.get(key.size() - 1))) key.truncate(1); - while (value.size() != 0 && isspace(value.get(0))) + while (value.isNotEmpty() && isspace(value.get(0))) value.shiftRight(1); if (Jupiter::INIFile::set(section, key, value)) @@ -424,7 +424,8 @@ bool Jupiter::INIFile::sync(const Jupiter::ReadableString &file) bool Jupiter::INIFile::sync() { - if (Jupiter::INIFile::data_->fName.size() == 0) return false; + if (Jupiter::INIFile::data_->fName.isEmpty()) + return false; return Jupiter::INIFile::sync(Jupiter::INIFile::data_->fName.c_str()); } @@ -576,7 +577,7 @@ const Jupiter::ReadableString &Jupiter::INIFile::get(const Jupiter::ReadableStri bool Jupiter::INIFile::getBool(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, bool defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asBool(); return defaultValue; } @@ -589,7 +590,7 @@ short Jupiter::INIFile::getShort(const Jupiter::ReadableString §ion, const J int Jupiter::INIFile::getInt(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, int defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asInt(); return defaultValue; } @@ -597,7 +598,7 @@ int Jupiter::INIFile::getInt(const Jupiter::ReadableString §ion, const Jupit long Jupiter::INIFile::getLong(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, long defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asInt(); return defaultValue; } @@ -605,7 +606,7 @@ long Jupiter::INIFile::getLong(const Jupiter::ReadableString §ion, const Jup long long Jupiter::INIFile::getLongLong(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, long long defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asLongLong(); return defaultValue; } @@ -613,7 +614,7 @@ long long Jupiter::INIFile::getLongLong(const Jupiter::ReadableString §ion, float Jupiter::INIFile::getFloat(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, float defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return float(val.asDouble()); return defaultValue; } @@ -621,7 +622,7 @@ float Jupiter::INIFile::getFloat(const Jupiter::ReadableString §ion, const J double Jupiter::INIFile::getDouble(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, double defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asDouble(); return defaultValue; } @@ -629,7 +630,7 @@ double Jupiter::INIFile::getDouble(const Jupiter::ReadableString §ion, const long double Jupiter::INIFile::getLongDouble(const Jupiter::ReadableString §ion, const Jupiter::ReadableString &key, long double defaultValue) const { const Jupiter::ReadableString &val = Jupiter::INIFile::get(section, key); - if (val.isEmpty() == false) + if (val.isNotEmpty()) return val.asDouble(); return defaultValue; } diff --git a/Jupiter/IRC_Client.cpp b/Jupiter/IRC_Client.cpp index e453883..8028322 100644 --- a/Jupiter/IRC_Client.cpp +++ b/Jupiter/IRC_Client.cpp @@ -131,22 +131,26 @@ Jupiter::IRC::Client::Client(const Jupiter::ReadableString &configSection) Jupiter::IRC::Client::data_->realName = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Realname"), STRING_LITERAL_AS_REFERENCE("Jupiter IRC Client")); Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Password")); - if (Jupiter::IRC::Client::data_->saslPass.size() == 0) Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Pass")); + if (Jupiter::IRC::Client::data_->saslPass.isEmpty()) + Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Pass")); Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Account")); - if (Jupiter::IRC::Client::data_->saslAccount.size() == 0) Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::data_->nickname; + if (Jupiter::IRC::Client::data_->saslAccount.isEmpty()) + Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::data_->nickname; Jupiter::IRC::Client::data_->autoPartMessage = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("AutoPartMessage")); Jupiter::IRC::Client::data_->ssl = Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("SSL")); Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Certificate")); Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Key")); - if (Jupiter::IRC::Client::data_->SSLCertificate.size() == 0) + if (Jupiter::IRC::Client::data_->SSLCertificate.isEmpty()) { Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Cert")); - if (Jupiter::IRC::Client::data_->SSLCertificate.size() == 0) Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::data_->SSLKey; + if (Jupiter::IRC::Client::data_->SSLCertificate.isEmpty()) + Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::data_->SSLKey; } - if (Jupiter::IRC::Client::data_->SSLKey.size() == 0) Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::data_->SSLCertificate; + if (Jupiter::IRC::Client::data_->SSLKey.isEmpty()) + Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::data_->SSLCertificate; Jupiter::IRC::Client::data_->joinOnKick = Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("AutoJoinOnKick")); Jupiter::IRC::Client::data_->reconnectDelay = Jupiter::IRC::Client::readConfigInt(STRING_LITERAL_AS_REFERENCE("AutoReconnectDelay")); @@ -161,17 +165,15 @@ Jupiter::IRC::Client::Client(const Jupiter::ReadableString &configSection) if (Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("PrintOutput"), true)) Jupiter::IRC::Client::data_->printOutput = stdout; else Jupiter::IRC::Client::data_->printOutput = nullptr; - if (Jupiter::IRC::Client::data_->logFileName.size() != 0) + if (Jupiter::IRC::Client::data_->logFileName.isNotEmpty()) Jupiter::IRC::Client::data_->logFile = fopen(Jupiter::IRC::Client::data_->logFileName.c_str(), "a+b"); else Jupiter::IRC::Client::data_->logFile = nullptr; if (Jupiter::IRC::Client::data_->ssl) { Jupiter::SecureTCPSocket *t = new Jupiter::SecureTCPSocket(); - if (Jupiter::IRC::Client::data_->SSLCertificate.size() != 0) - { + if (Jupiter::IRC::Client::data_->SSLCertificate.isNotEmpty()) t->setCertificate(Jupiter::IRC::Client::data_->SSLCertificate, Jupiter::IRC::Client::data_->SSLKey); - } Jupiter::IRC::Client::data_->sock = t; } else Jupiter::IRC::Client::data_->sock = new Jupiter::TCPSocket(); @@ -542,7 +544,7 @@ int Jupiter::IRC::Client::primaryHandler() for (unsigned int currentLine = 0; currentLine < totalLines; currentLine++) { Jupiter::ReferenceString buff = Jupiter::IRC::Client::data_->buffer.getWord(currentLine, ENDL); - if (buff.size() != 0) + if (buff.isNotEmpty()) { Jupiter::IRC::Client::writeToLogs(buff); if (Jupiter::IRC::Client::data_->printOutput != nullptr) @@ -550,13 +552,13 @@ int Jupiter::IRC::Client::primaryHandler() buff.println(Jupiter::IRC::Client::data_->printOutput); } Jupiter::ReferenceString w1 = Jupiter::ReferenceString::getWord(buff, 0, WHITESPACE); - if (w1.size() != 0) + if (w1.isNotEmpty()) { Jupiter::ReferenceString w2 = Jupiter::ReferenceString::getWord(buff, 1, WHITESPACE); int numeric = w2.asInt(10); if (w1[0] == ':') //Messages { - if (w2.size() != 0) + if (w2.isNotEmpty()) { switch (numeric) // Numerics that don't rely on a specific connectionStatus. { @@ -653,10 +655,8 @@ int Jupiter::IRC::Client::primaryHandler() Jupiter::IRC::Client::data_->sock = t; Jupiter::IRC::Client::data_->ssl = true; // toggle blocking to prevent error - if (Jupiter::IRC::Client::data_->SSLCertificate.size() != 0) - { + if (Jupiter::IRC::Client::data_->SSLCertificate.isNotEmpty()) t->setCertificate(Jupiter::IRC::Client::data_->SSLCertificate, Jupiter::IRC::Client::data_->SSLKey); - } bool goodSSL; if (t->getBlockingMode() == false) @@ -705,7 +705,7 @@ int Jupiter::IRC::Client::primaryHandler() else if (curr.equalsi("userhost-in-names")) req += "userhost-in-names "; else if (curr.equalsi("sasl")) { - if (Jupiter::IRC::Client::data_->saslPass.size() != 0) + if (Jupiter::IRC::Client::data_->saslPass.isNotEmpty()) { req += "sasl "; sasl = true; @@ -776,7 +776,7 @@ int Jupiter::IRC::Client::primaryHandler() else if (Jupiter::IRC::Client::data_->nickname.equalsi(configNick)) { Jupiter::IRC::Client::data_->nickname = altNick; - if (Jupiter::IRC::Client::data_->nickname.size() != 0) + if (Jupiter::IRC::Client::data_->nickname.isNotEmpty()) Jupiter::IRC::Client::data_->sock->send(Jupiter::StringS::Format("NICK %.*s" ENDL, Jupiter::IRC::Client::data_->nickname.size(), Jupiter::IRC::Client::data_->nickname.ptr())); } // Note: Add a series of contains() functions to String_Type. @@ -895,10 +895,10 @@ int Jupiter::IRC::Client::primaryHandler() if (w2.equalsi("PRIVMSG")) { Jupiter::ReferenceString chan = Jupiter::ReferenceString::getWord(buff, 2, WHITESPACE); - if (chan.size() != 0) + if (chan.isNotEmpty()) { Jupiter::ReferenceString nick = getSender(buff); - if (nick.size() != 0) + if (nick.isNotEmpty()) { Jupiter::ReferenceString premessage = Jupiter::ReferenceString::substring(buff, buff.find(':', 1) + 1); if (premessage[0] == '\001') //CTCP (ACTIONs are included) @@ -958,7 +958,7 @@ int Jupiter::IRC::Client::primaryHandler() else if (w2.equalsi("NOTICE")) { Jupiter::ReferenceString chan = Jupiter::ReferenceString::getWord(buff, 2, WHITESPACE); - if (chan.size() != 0) + if (chan.isNotEmpty()) { size_t pos = buff.find('!', 0); auto message = Jupiter::ReferenceString::substring(buff, buff.find(':', 1) + 1, buff.size()); @@ -972,7 +972,7 @@ int Jupiter::IRC::Client::primaryHandler() else { auto sender = getSender(buff); - if (sender.size() != 0) + if (sender.isNotEmpty()) { this->OnServerNotice(chan, sender, message); for (size_t i = 0; i < Jupiter::plugins->size(); i++) @@ -985,7 +985,7 @@ int Jupiter::IRC::Client::primaryHandler() { auto nick = getSender(buff); Jupiter::ReferenceString newnick = Jupiter::ReferenceString::substring(buff, buff.find(' ', 1) + 1); - if (newnick.size() != 0 && newnick[0] == ':') newnick.shiftRight(1); + if (newnick.isNotEmpty() && newnick[0] == ':') newnick.shiftRight(1); if (nick.equalsi(Jupiter::IRC::Client::data_->nickname)) { Jupiter::IRC::Client::data_->nickname = newnick; @@ -1012,7 +1012,7 @@ int Jupiter::IRC::Client::primaryHandler() channel->data_->isAddingNames = true; if (channel->getType() < 0) { - if (Jupiter::IRC::Client::data_->autoPartMessage.size() != 0) + if (Jupiter::IRC::Client::data_->autoPartMessage.isNotEmpty()) Jupiter::IRC::Client::partChannel(chan, Jupiter::IRC::Client::data_->autoPartMessage); else Jupiter::IRC::Client::partChannel(chan); @@ -1025,10 +1025,10 @@ int Jupiter::IRC::Client::primaryHandler() else if (w2.equalsi("PART")) { auto nick = getSender(buff); - if (nick.size() != 0) + if (nick.isNotEmpty()) { Jupiter::ReferenceString chan = Jupiter::ReferenceString::getWord(buff, 2, WHITESPACE); - if (chan.size() != 0) + if (chan.isNotEmpty()) { int i = Jupiter::IRC::Client::getChannelIndex(chan); if (i >= 0) @@ -1054,13 +1054,13 @@ int Jupiter::IRC::Client::primaryHandler() else if (w2.equalsi("KICK")) { Jupiter::ReferenceString chan = Jupiter::ReferenceString::getWord(buff, 2, WHITESPACE); - if (chan.size() != 0) + if (chan.isNotEmpty()) { Jupiter::ReferenceString kicker = getSender(buff); - if (kicker.size() != 0) + if (kicker.isNotEmpty()) { Jupiter::ReferenceString kicked = Jupiter::ReferenceString::getWord(buff, 3, WHITESPACE); - if (kicked.size() != 0) + if (kicked.isNotEmpty()) { int i = Jupiter::IRC::Client::getChannelIndex(chan); if (i >= 0) @@ -1116,18 +1116,18 @@ int Jupiter::IRC::Client::primaryHandler() else if (w2.equalsi("MODE")) { Jupiter::ReferenceString chan = Jupiter::ReferenceString::getWord(buff, 2, WHITESPACE); - if (chan.size() != 0) + if (chan.isNotEmpty()) { if (Jupiter::IRC::Client::data_->chanTypes.contains(chan[0])) { auto nick = getSender(buff); - if (nick.size() != 0) + if (nick.isNotEmpty()) { Jupiter::ReferenceString modestring = Jupiter::ReferenceString::substring(buff, buff.find(' ', 2) + 1); if (modestring.wordCount(" ") > 1) { Jupiter::ReferenceString modes = modestring.getWord(0, " "); - if (modes.isEmpty() == false) + if (modes.isNotEmpty()) { modestring.shiftRight(modestring.find(' ') + 1); Jupiter::ReferenceString tword; @@ -1141,7 +1141,7 @@ int Jupiter::IRC::Client::primaryHandler() { tword = modestring.getWord(g, " "); - if (tword.isEmpty() == false) + if (tword.isNotEmpty()) { Jupiter::IRC::Client::Channel *channel; for (unsigned int channelIndex = 0; channelIndex < Jupiter::IRC::Client::data_->channels.size(); channelIndex++) @@ -1210,7 +1210,7 @@ int Jupiter::IRC::Client::primaryHandler() } else if (w1.equals("NICK")) { - if (w2.isEmpty() == false) + if (w2.isNotEmpty()) Jupiter::IRC::Client::data_->nickname = w2; } else if (w1.equals("ERROR")) @@ -1223,7 +1223,7 @@ int Jupiter::IRC::Client::primaryHandler() } else if (w1.equals("AUTHENTICATE")) { - if (Jupiter::IRC::Client::data_->saslPass.size() != 0) + if (Jupiter::IRC::Client::data_->saslPass.isNotEmpty()) { size_t authStringLen = Jupiter::IRC::Client::data_->nickname.size() + Jupiter::IRC::Client::data_->saslAccount.size() + Jupiter::IRC::Client::data_->saslPass.size() + 2; char *authString = new char[authStringLen + 1]; @@ -1269,7 +1269,7 @@ int Jupiter::IRC::Client::primaryHandler() bool Jupiter::IRC::Client::connect() { const Jupiter::ReadableString &clientAddress = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("ClientAddress")); - if (Jupiter::IRC::Client::data_->sock->connect(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.size() == 0 ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong(STRING_LITERAL_AS_REFERENCE("ClientPort"))) == false) + if (Jupiter::IRC::Client::data_->sock->connect(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.isEmpty() ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong(STRING_LITERAL_AS_REFERENCE("ClientPort"))) == false) return false; Jupiter::IRC::Client::data_->sock->setBlocking(false); @@ -1297,7 +1297,7 @@ void Jupiter::IRC::Client::disconnect(bool stayDead) if (Jupiter::IRC::Client::data_->ssl) { Jupiter::SecureTCPSocket *t = new Jupiter::SecureTCPSocket(std::move(*Jupiter::IRC::Client::data_->sock)); - if (Jupiter::IRC::Client::data_->SSLCertificate.size() != 0) + if (Jupiter::IRC::Client::data_->SSLCertificate.isNotEmpty()) t->setCertificate(Jupiter::IRC::Client::data_->SSLCertificate, Jupiter::IRC::Client::data_->SSLKey); delete Jupiter::IRC::Client::data_->sock; @@ -1350,35 +1350,40 @@ int Jupiter::IRC::Client::think() const Jupiter::ReadableString &Jupiter::IRC::Client::readConfigValue(const Jupiter::ReadableString &key, const Jupiter::ReadableString &defaultValue) const { const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); - if (val.size() != 0) return val; + if (val.isNotEmpty()) + return val; return Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); } bool Jupiter::IRC::Client::readConfigBool(const Jupiter::ReadableString &key, bool defaultValue) const { const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); - if (val.size() != 0) return val.asBool(); + if (val.isNotEmpty()) + return val.asBool(); return Jupiter::IRC::Client::Config->getBool(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); } int Jupiter::IRC::Client::readConfigInt(const Jupiter::ReadableString &key, int defaultValue) const { const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); - if (val.size() != 0) return val.asInt(); + if (val.isNotEmpty()) + return val.asInt(); return Jupiter::IRC::Client::Config->getInt(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); } long Jupiter::IRC::Client::readConfigLong(const Jupiter::ReadableString &key, long defaultValue) const { const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); - if (val.size() != 0) return val.asInt(); + if (val.isNotEmpty()) + return val.asInt(); return Jupiter::IRC::Client::Config->getInt(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); } double Jupiter::IRC::Client::readConfigDouble(const Jupiter::ReadableString &key, double defaultValue) const { const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); - if (val.size() != 0) return val.asDouble(); + if (val.isNotEmpty()) + return val.asDouble(); return Jupiter::IRC::Client::Config->getDouble(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); } @@ -1449,7 +1454,7 @@ void Jupiter::IRC::Client::Data::addNamesToChannel(unsigned int index, Jupiter:: for (unsigned int i = 0; i != nameLen; i++) { t = Jupiter::ReferenceString::getWord(names, i, " "); - if (t.size() != 0) + if (t.isNotEmpty()) { offset = t.span(Jupiter::IRC::Client::Data::prefixes); t.shiftRight(offset); @@ -1539,7 +1544,7 @@ Jupiter::IRC::Client::Channel::Channel(const Jupiter::ReadableString &channelNam iFace->readConfigValue(key); Jupiter::ReferenceString value = iFace->readConfigValue(key); - if (value.size() != 0) + if (value.isNotEmpty()) { Jupiter::IRC::Client::Channel::data_->type = value.asInt(); return; @@ -1552,14 +1557,14 @@ Jupiter::IRC::Client::Channel::Channel(const Jupiter::ReadableString &channelNam offset = key.aformat("%u", i); value.set(iFace->readConfigValue(key)); - if (value.size() == 0) // No more channels in the list. + if (value.isEmpty()) // No more channels in the list. break; if (value.getWord(0, WHITESPACE).equalsi(channelName)) // This is our channel. { offset += key.concat(".Type"); value.set(iFace->readConfigValue(key)); - if (value.size() != 0) + if (value.isNotEmpty()) Jupiter::IRC::Client::Channel::data_->type = value.asInt(); else if (iFace->getDefaultChanType() < 0) Jupiter::IRC::Client::Channel::data_->type = 0; diff --git a/Jupiter/Readable_String.h b/Jupiter/Readable_String.h index 21b15cc..bb5fb0f 100644 --- a/Jupiter/Readable_String.h +++ b/Jupiter/Readable_String.h @@ -71,6 +71,13 @@ namespace Jupiter */ virtual bool isEmpty() const; + /** + * @brief Checks if the String is not empty. + * + * @return True if the String is not empty, false otherwise. + */ + virtual bool isNotEmpty() const; + /** * @brief Checks if the string contains an element with the specified value. * diff --git a/Jupiter/Readable_String_Imp.h b/Jupiter/Readable_String_Imp.h index 71708f1..8d25fea 100644 --- a/Jupiter/Readable_String_Imp.h +++ b/Jupiter/Readable_String_Imp.h @@ -39,6 +39,11 @@ template bool Jupiter::Readable_String::isEmpty() const return this->size() == 0; } +template bool Jupiter::Readable_String::isNotEmpty() const +{ + return this->size() != 0; +} + // contains template bool Jupiter::Readable_String::contains(const T &value) const @@ -64,9 +69,12 @@ template size_t Jupiter::Readable_String::find(const T &value, si template size_t Jupiter::Readable_String::find(const Jupiter::Readable_String &in) const { - if (in.size() > this->size()) return Jupiter::INVALID_INDEX; - if (in.size() == this->size()) return this->equals(in) ? 0 : Jupiter::INVALID_INDEX; - if (in.size() == 0) return 0; + if (in.size() > this->size()) + return Jupiter::INVALID_INDEX; + if (in.size() == this->size()) + return this->equals(in) ? 0 : Jupiter::INVALID_INDEX; + if (in.isEmpty()) + return 0; for (size_t i = 0, j; i != this->size() - in.size() + 1; i++) { @@ -114,9 +122,12 @@ template size_t Jupiter::Readable_String::findi(const T &value, s template<> size_t inline Jupiter::Readable_String::findi(const Jupiter::Readable_String &in) const { - if (in.size() > this->size()) return Jupiter::INVALID_INDEX; - if (in.size() == this->size()) return this->equalsi(in) ? 0 : Jupiter::INVALID_INDEX; - if (in.size() == 0) return 0; + if (in.size() > this->size()) + return Jupiter::INVALID_INDEX; + if (in.size() == this->size()) + return this->equalsi(in) ? 0 : Jupiter::INVALID_INDEX; + if (in.isEmpty()) + return 0; for (size_t i = 0, j; i != this->size() - in.size() + 1; i++) { @@ -129,9 +140,12 @@ template<> size_t inline Jupiter::Readable_String::findi(const Jupiter::Re template<> size_t inline Jupiter::Readable_String::findi(const Jupiter::Readable_String &in) const { - if (in.size() > this->size()) return Jupiter::INVALID_INDEX; - if (in.size() == this->size()) return this->equalsi(in) ? 0 : Jupiter::INVALID_INDEX; - if (in.size() == 0) return 0; + if (in.size() > this->size()) + return Jupiter::INVALID_INDEX; + if (in.size() == this->size()) + return this->equalsi(in) ? 0 : Jupiter::INVALID_INDEX; + if (in.isEmpty()) + return 0; for (size_t i = 0, j; i != this->size() - in.size() + 1; i++) { @@ -1140,7 +1154,7 @@ template template class R> R Jupiter::Readable template template class R> R Jupiter::Readable_String::getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) { - if (token.size() == 0) + if (token.isEmpty()) return R(in); if (token.size() == 1) return Jupiter::Readable_String::getToken(in, pos, token.get(0)); @@ -1243,7 +1257,7 @@ template template class R> R Jupiter::Readable template template class R> R Jupiter::Readable_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) { - if (pos == 0 || token.size() == 0) + if (pos == 0 || token.isEmpty()) return R(in); if (token.size() == 1) return Jupiter::Readable_String::gotoToken(in, pos, token.get(0)); diff --git a/Jupiter/SecureSocket.cpp b/Jupiter/SecureSocket.cpp index 9051358..c693cd1 100644 --- a/Jupiter/SecureSocket.cpp +++ b/Jupiter/SecureSocket.cpp @@ -202,7 +202,8 @@ bool Jupiter::SecureSocket::initSSL() ERR_print_errors_fp(stderr); return false; } - if (Jupiter::SecureSocket::SSLdata_->cert.size() != 0) loadCertificate(Jupiter::SecureSocket::SSLdata_->context, Jupiter::SecureSocket::SSLdata_->cert.c_str(), Jupiter::SecureSocket::SSLdata_->key.c_str()); + if (Jupiter::SecureSocket::SSLdata_->cert.isNotEmpty()) + loadCertificate(Jupiter::SecureSocket::SSLdata_->context, Jupiter::SecureSocket::SSLdata_->cert.c_str(), Jupiter::SecureSocket::SSLdata_->key.c_str()); Jupiter::SecureSocket::SSLdata_->handle = SSL_new(Jupiter::SecureSocket::SSLdata_->context); if (Jupiter::SecureSocket::SSLdata_->handle == nullptr) { diff --git a/Jupiter/String_Type_Imp.h b/Jupiter/String_Type_Imp.h index 9fac61f..788426d 100644 --- a/Jupiter/String_Type_Imp.h +++ b/Jupiter/String_Type_Imp.h @@ -429,7 +429,7 @@ template size_t Jupiter::String_Type::insert(size_t index, const if (index >= Jupiter::String_Type::length) return this->concat(value); - if (value.size() == 0) + if (value.isEmpty()) return Jupiter::String_Type::length; if (value.size() == 1) diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 973a4b80f0a8afb98f59de20b0c93c08af9010b8..df56c4a67f07fca67f84866352f96bba2bf1a244 100644 GIT binary patch delta 19746 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 Vi3#Hc!jc!}gN01@XP77I{{VSh`kVj&