Document most of CString and MCString

There are only some "minor" functions that are still undocumented now.

This also sneaks in an API change: A useless file mode argument to
MCString::ReadFromDisk() is gone. Opening a file doesn't ask for a file mode.


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@2157 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
psychon
2010-10-11 14:24:36 +00:00
parent 9c2692f1f1
commit 4ffcdc4b55
3 changed files with 213 additions and 8 deletions

View File

@@ -147,7 +147,7 @@ void CModule::SetClient(CClient* pClient) { m_pClient = pClient; }
bool CModule::LoadRegistry() {
//CString sPrefix = (m_pUser) ? m_pUser->GetUserName() : ".global";
return (m_mssRegistry.ReadFromDisk(GetSavePath() + "/.registry", 0600) == MCString::MCS_SUCCESS);
return (m_mssRegistry.ReadFromDisk(GetSavePath() + "/.registry") == MCString::MCS_SUCCESS);
}
bool CModule::SaveRegistry() const {

View File

@@ -1031,7 +1031,7 @@ bool CString::RightChomp(unsigned int uLen) {
}
//////////////// MCString ////////////////
int MCString::WriteToDisk(const CString& sPath, mode_t iMode) const {
MCString::status_t MCString::WriteToDisk(const CString& sPath, mode_t iMode) const {
CFile cFile(sPath);
if (this->empty()) {
@@ -1066,10 +1066,10 @@ int MCString::WriteToDisk(const CString& sPath, mode_t iMode) const {
return MCS_SUCCESS;
}
int MCString::ReadFromDisk(const CString& sPath, mode_t iMode) {
MCString::status_t MCString::ReadFromDisk(const CString& sPath) {
clear();
CFile cFile(sPath);
if (!cFile.Open(O_RDONLY, iMode)) {
if (!cFile.Open(O_RDONLY)) {
return MCS_EOPEN;
}

View File

@@ -226,31 +226,108 @@ public:
*/
CString Right(unsigned int uCount) const;
/** Get the first line of this string.
* @return The first line of text.
*/
CString FirstLine() const { return Token(0, false, "\n"); }
/** Get a token out of this string. For example in the string "a bc d e",
* each of "a", "bc", "d" and "e" are tokens.
* @param uPos The number of the token you are interested. The first
* token has a position of 0.
* @param bRest If false, only the token you asked for is returned. Else
* you get the substring starting from the beginning of
* your token.
* @param sSep Seperator between tokens.
* @param bAllowEmpty If this is true, empty tokens are allowed. In the
* example from above this means that there is a
* token "" before the "e" token.
* @return The token you asked for and, if bRest is true, everything
* after it.
* @see Split() if you need a string split into all of its tokens.
*/
CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ", bool bAllowEmpty = false) const;
/** Get a token out of this string. This function behaves much like the
* other Token() function in this class. The extra arguments are
* handled similarly to Split().
*/
CString Token(unsigned int uPos, bool bRest, const CString& sSep, bool bAllowEmpty, const CString& sLeft, const CString& sRight, bool bTrimQuotes = true) const;
unsigned int URLSplit(MCString& msRet) const;
unsigned int OptionSplit(MCString& msRet, bool bUpperKeys = false) const;
unsigned int QuoteSplit(VCString& vsRet) const;
/** Split up this string into tokens.
* Via sLeft and sRight you can define "markers" like with Replace().
* Anything in such a marked section is treated as a single token. All
* occurences of sDelim in such a block are ignored.
* @param sDelim Delimiter between tokens.
* @param vsRet Vector for returning the result.
* @param bAllowEmpty Do empty tokens count as a valid token?
* @param sLeft Left delimiter like with Replace().
* @param sRight Right delimiter like with Replace().
* @param bTrimQuotes Should sLeft and sRight be removed from the token
* they mark?
* @param bTrimWhiteSpace If this is true, CString::Trim() is called on
* each token.
* @return The number of tokens found.
*/
unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true,
const CString& sLeft = "", const CString& sRight = "", bool bTrimQuotes = true,
bool bTrimWhiteSpace = false) const;
/** Split up this string into tokens.
* This function is identical to the other CString::Split(), except that
* the result is returned as a SCString instead of a VCString.
*/
unsigned int Split(const CString& sDelim, SCString& ssRet, bool bAllowEmpty = true,
const CString& sLeft = "", const CString& sRight = "", bool bTrimQuotes = true,
bool bTrimWhiteSpace = false) const;
/** Produces a random string.
* @param uLength The length of the resulting string.
* @return A random string.
*/
static CString RandomString(unsigned int uLength);
/** @return The MD5 hash of this string. */
CString MD5() const;
/** @return The SHA256 hash of this string. */
CString SHA256() const;
/** Treat this string as base64-encoded data and decode it.
* @param sRet String to which the result of the decode is safed.
* @return The length of the resulting string.
*/
unsigned long Base64Decode(CString& sRet) const;
/** Treat this string as base64-encoded data and decode it.
* The result is saved in this CString instance.
* @return The length of the resulting string.
*/
unsigned long Base64Decode();
/** Treat this string as base64-encoded data and decode it.
* @return The decoded string.
*/
CString Base64Decode_n() const;
/** Base64-encode the current string.
* @param sRet String where the result is saved.
* @param uWrap A boolean(!?!) that decides if the result should be
* wrapped after everywhere 57 characters.
* @return true unless this code is buggy.
* @todo WTF @ uWrap.
* @todo This only returns false if some formula we use was wrong?!
*/
bool Base64Encode(CString& sRet, unsigned int uWrap = 0) const;
/** Base64-encode the current string.
* This string is overwritten with the result of the encode.
* @todo return value and param are as with Base64Encode() from above.
*/
bool Base64Encode(unsigned int uWrap = 0);
/** Base64-encode the current string
* @todo uWrap is as broken as Base64Encode()'s uWrap.
* @return The encoded string.
*/
CString Base64Encode_n(unsigned int uWrap = 0) const;
#ifdef HAVE_LIBSSL
@@ -261,36 +338,122 @@ public:
void Crypt(const CString& sPass, bool bEncrypt, const CString& sIvec = "");
#endif
/** Pretty-print a percent value.
* @param d The percent value. This should be in range 0-100.
* @return The "pretty" string.
*/
static CString ToPercent(double d);
/** Pretty-print a number of bytes.
* @param d The number of bytes.
* @return A string describing the number of bytes.
*/
static CString ToByteStr(unsigned long long d);
/** Pretty-print a time span.
* @param s Number of seconds to print.
* @return A string like "4w 6d 4h 3m 58s".
*/
static CString ToTimeStr(unsigned long s);
/** @return True if this string is not "false". */
bool ToBool() const;
/** @return The numerical value of this string similar to atoi(). */
short ToShort() const;
/** @return The numerical value of this string similar to atoi(). */
unsigned short ToUShort() const;
/** @return The numerical value of this string similar to atoi(). */
int ToInt() const;
/** @return The numerical value of this string similar to atoi(). */
long ToLong() const;
/** @return The numerical value of this string similar to atoi(). */
unsigned int ToUInt() const;
/** @return The numerical value of this string similar to atoi(). */
unsigned long ToULong() const;
/** @return The numerical value of this string similar to atoi(). */
unsigned long long ToULongLong() const;
/** @return The numerical value of this string similar to atoi(). */
long long ToLongLong() const;
/** @return The numerical value of this string similar to atoi(). */
double ToDouble() const;
/** Trim this string. All leading/trailing occurences of characters from
* s are removed.
* @param s A list of characters that should be trimmed.
* @return true if this string was modified.
*/
bool Trim(const CString& s = " \t\r\n");
/** Trim this string. All leading occurences of characters from s are
* removed.
* @param s A list of characters that should be trimmed.
* @return true if this string was modified.
*/
bool TrimLeft(const CString& s = " \t\r\n");
/** Trim this string. All trailing occurences of characters from s are
* removed.
* @param s A list of characters that should be trimmed.
* @return true if this string was modified.
*/
bool TrimRight(const CString& s = " \t\r\n");
/** Trim this string. All leading/trailing occurences of characters from
* s are removed. This CString instance is not modified.
* @param s A list of characters that should be trimmed.
* @return The trimmed string.
*/
CString Trim_n(const CString& s = " \t\r\n") const;
/** Trim this string. All leading occurences of characters from s are
* removed. This CString instance is not modified.
* @param s A list of characters that should be trimmed.
* @return The trimmed string.
*/
CString TrimLeft_n(const CString& s = " \t\r\n") const;
/** Trim this string. All trailing occurences of characters from s are
* removed. This CString instance is not modified.
* @param s A list of characters that should be trimmed.
* @return The trimmed string.
*/
CString TrimRight_n(const CString& s = " \t\r\n") const;
/** Trim a given prefix.
* @param sPrefix The prefix that should be removed.
* @return True if this string was modified.
*/
bool TrimPrefix(const CString& sPrefix);
/** Trim a given suffix.
* @param sSuffix The suffix that should be removed.
* @return True if this string was modified.
*/
bool TrimSuffix(const CString& sSuffix);
/** Trim a given prefix.
* @param sPrefix The prefix that should be removed.
* @return A copy of this string without the prefix.
*/
CString TrimPrefix_n(const CString& sPrefix) const;
/** Trim a given suffix.
* @param sSuffix The suffix that should be removed.
* @return A copy of this string without the prefix.
*/
CString TrimSuffix_n(const CString& sSuffix) const;
/** Remove characters from the beginning of this string.
* @param uLen The number of characters to remove.
* @return true if this string was modified.
*/
bool LeftChomp(unsigned int uLen = 1);
/** Remove characters from the end of this string.
* @param uLen The number of characters to remove.
* @return true if this string was modified.
*/
bool RightChomp(unsigned int uLen = 1);
/** Remove characters from the beginning of this string.
* This string object isn't modified.
* @param uLen The number of characters to remove.
* @return The result of the conversion.
*/
CString LeftChomp_n(unsigned int uLen = 1) const;
/** Remove characters from the end of this string.
* This string object isn't modified.
* @param uLen The number of characters to remove.
* @return The result of the conversion.
*/
CString RightChomp_n(unsigned int uLen = 1) const;
private:
@@ -298,28 +461,70 @@ protected:
unsigned char* strnchr(const unsigned char* src, unsigned char c, unsigned int iMaxBytes, unsigned char* pFill = NULL, unsigned int* piCount = NULL) const;
};
/**
* @brief A dictionary for strings.
*
* This class maps strings to other strings.
*/
class MCString : public map<CString, CString> {
public:
/** Construct an empty MCString. */
MCString() : map<CString, CString>() {}
/** Destruct this MCString. */
virtual ~MCString() { clear(); }
enum
/** Status codes that can be returned by WriteToDisk() and
* ReadFromDisk(). */
enum status_t
{
/// No errors.
MCS_SUCCESS = 0,
/// Opening the file failed.
MCS_EOPEN = 1,
/// Writing to the file failed.
MCS_EWRITE = 2,
/// WriteFilter() failed.
MCS_EWRITEFIL = 3,
/// ReadFilter() failed.
MCS_EREADFIL = 4
};
int WriteToDisk(const CString& sPath, mode_t iMode = 0644) const;
int ReadFromDisk(const CString& sPath, mode_t iMode = 0644);
/** Write this map to a file.
* @param sPath The file name to write to.
* @param iMode The mode for the file.
* @return The result of the operation.
* @see WriteFilter.
*/
enum status_t WriteToDisk(const CString& sPath, mode_t iMode = 0644) const;
/** Read a map from a file.
* @param sPath The file name to read from.
* @return The result of the operation.
* @see ReadFilter.
*/
enum status_t ReadFromDisk(const CString& sPath);
/** Filter used while writing this map. This function is called by
* WriteToDisk() for each pair that is going to be written. This
* function has the chance to modify the data that will be written.
* @param sKey The key that will be written. Can be modified.
* @param sValue The value that will be written. Can be modified.
* @return true unless WriteToDisk() should fail with MCS_EWRITEFIL.
*/
virtual bool WriteFilter(CString& sKey, CString& sValue) const { return true; }
/** Filter used while reading this map. This function is called by
* ReadFromDisk() for each pair that is beging read. This function has
* the chance to modify the data that is being read.
* @param sKey The key that was read. Can be modified.
* @param sValue The value that was read. Can be modified.
* @return true unless ReadFromDisk() should fail with MCS_EWRITEFIL.
*/
virtual bool ReadFilter(CString& sKey, CString& sValue) const { return true; }
//! make them parse safe, right now using hex encoding on anything !isalnum
/** Encode a value so that it can safely be parsed by ReadFromDisk().
* This is an internal function.
*/
virtual CString& Encode(CString& sValue) const;
/** Undo the effects of Encode(). This is an internal function. */
virtual CString& Decode(CString& sValue) const;
};