From 2568bad3cc1ae70350f5ad31e97b4c13194e437e Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Wed, 1 Feb 2012 13:43:47 +0000 Subject: sprintf() begone! Replaced with StringUtils' Printf() git-svn-id: http://mc-server.googlecode.com/svn/trunk@216 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- iniFile/iniFile.cpp | 121 +++++++++++++++++---- iniFile/iniFile.h | 305 ++++++++++++++++++++++++++-------------------------- 2 files changed, 254 insertions(+), 172 deletions(-) (limited to 'iniFile') diff --git a/iniFile/iniFile.cpp b/iniFile/iniFile.cpp index d1c15df16..2f99c0c17 100644 --- a/iniFile/iniFile.cpp +++ b/iniFile/iniFile.cpp @@ -38,11 +38,13 @@ using namespace std; #endif #ifndef _WIN32 -#define sprintf_s(buffer, buffer_size, stringbuffer, ...) (sprintf(buffer, stringbuffer, __VA_ARGS__)) -#define vsprintf_s(buffer, stringbuffer, ...) (vsprintf(buffer, stringbuffer, __VA_ARGS__)) #define sscanf_s(buffer, stringbuffer, ...) (sscanf(buffer, stringbuffer, __VA_ARGS__)) #endif + + + + cIniFile::cIniFile( const string iniPath) { Path( iniPath); @@ -115,6 +117,10 @@ bool cIniFile::ReadFile() return false; } + + + + bool cIniFile::WriteFile() { unsigned commentID, keyID, valueID; @@ -148,6 +154,10 @@ bool cIniFile::WriteFile() return true; } + + + + long cIniFile::FindKey( const string & keyname) const { for ( unsigned keyID = 0; keyID < names.size(); ++keyID) @@ -156,6 +166,10 @@ long cIniFile::FindKey( const string & keyname) const return noID; } + + + + long cIniFile::FindValue( unsigned const keyID, const string & valuename) const { if ( !keys.size() || keyID >= keys.size()) @@ -167,6 +181,10 @@ long cIniFile::FindValue( unsigned const keyID, const string & valuename) const return noID; } + + + + unsigned cIniFile::AddKeyName( const string & keyname) { names.resize( names.size() + 1, keyname); @@ -174,6 +192,10 @@ unsigned cIniFile::AddKeyName( const string & keyname) return names.size() - 1; } + + + + string cIniFile::KeyName( unsigned const keyID) const { if ( keyID < names.size()) @@ -182,6 +204,10 @@ string cIniFile::KeyName( unsigned const keyID) const return ""; } + + + + unsigned cIniFile::NumValues( unsigned const keyID) { if ( keyID < keys.size()) @@ -189,6 +215,10 @@ unsigned cIniFile::NumValues( unsigned const keyID) return 0; } + + + + unsigned cIniFile::NumValues( const string & keyname) { long keyID = FindKey( keyname); @@ -197,6 +227,10 @@ unsigned cIniFile::NumValues( const string & keyname) return keys[keyID].names.size(); } + + + + string cIniFile::ValueName( unsigned const keyID, unsigned const valueID) const { if ( keyID < keys.size() && valueID < keys[keyID].names.size()) @@ -204,6 +238,10 @@ string cIniFile::ValueName( unsigned const keyID, unsigned const valueID) const return ""; } + + + + string cIniFile::ValueName( const string & keyname, unsigned const valueID) const { long keyID = FindKey( keyname); @@ -212,6 +250,10 @@ string cIniFile::ValueName( const string & keyname, unsigned const valueID) cons return ValueName( keyID, valueID); } + + + + bool cIniFile::SetValue( unsigned const keyID, unsigned const valueID, const string & value) { if ( keyID < keys.size() && valueID < keys[keyID].names.size()) @@ -220,6 +262,10 @@ bool cIniFile::SetValue( unsigned const keyID, unsigned const valueID, const str return false; } + + + + bool cIniFile::SetValue( const string & keyname, const string & valuename, const string & value, bool const create) { long keyID = FindKey( keyname); @@ -250,33 +296,48 @@ bool cIniFile::SetValue( const string & keyname, const string & valuename, const return true; } + + + + bool cIniFile::SetValueI( const string & keyname, const string & valuename, int const value, bool const create) { - char svalue[MAX_VALUEDATA]; - - sprintf_s( svalue, MAX_VALUEDATA, "%d", value); - return SetValue( keyname, valuename, svalue, create); + AString Data; + Printf(Data, "%d", value); + return SetValue( keyname, valuename, Data, create); } + + + + bool cIniFile::SetValueF( const string & keyname, const string & valuename, double const value, bool const create) { - char svalue[MAX_VALUEDATA]; - - sprintf_s( svalue, MAX_VALUEDATA, "%f", value); - return SetValue( keyname, valuename, svalue, create); + AString Data; + Printf(Data, "%f", value); + return SetValue( keyname, valuename, Data, create); } + + + + bool cIniFile::SetValueV( const string & keyname, const string & valuename, char *format, ...) { va_list args; - char value[MAX_VALUEDATA]; va_start( args, format); - vsprintf_s( value, format, args); + + AString Data; + AppendVPrintf(Data, format, args); va_end( args); - return SetValue( keyname, valuename, value ); + return SetValue( keyname, valuename, Data); } + + + + string cIniFile::GetValue( unsigned const keyID, unsigned const valueID, const string & defValue) const { if ( keyID < keys.size() && valueID < keys[keyID].names.size()) @@ -284,6 +345,10 @@ string cIniFile::GetValue( unsigned const keyID, unsigned const valueID, const s return defValue; } + + + + string cIniFile::GetValue( const string & keyname, const string & valuename, const string & defValue) const { long keyID = FindKey( keyname); @@ -297,22 +362,32 @@ string cIniFile::GetValue( const string & keyname, const string & valuename, con return keys[keyID].values[valueID]; } + + + + int cIniFile::GetValueI(const string & keyname, const string & valuename, int const defValue) const { - char svalue[MAX_VALUEDATA]; - - sprintf_s( svalue, MAX_VALUEDATA, "%d", defValue); - return atoi( GetValue( keyname, valuename, svalue).c_str()); + AString Data; + Printf(Data, "%d", defValue); + return atoi( GetValue( keyname, valuename, Data).c_str()); } + + + + double cIniFile::GetValueF(const string & keyname, const string & valuename, double const defValue) const { - char svalue[MAX_VALUEDATA]; - - sprintf_s( svalue, MAX_VALUEDATA, "%f", defValue); - return atof( GetValue( keyname, valuename, svalue).c_str()); + AString Data; + Printf(Data, "%f", defValue); + return atof( GetValue( keyname, valuename, Data).c_str()); } + + + + // 16 variables may be a bit of over kill, but hey, it's only code. unsigned cIniFile::GetValueV( const string & keyname, const string & valuename, char *format, void *v1, void *v2, void *v3, void *v4, @@ -342,6 +417,10 @@ unsigned cIniFile::GetValueV( const string & keyname, const string & valuename, return nVals; } + + + + bool cIniFile::DeleteValueByID( const unsigned keyID, const unsigned valueID ) { if ( keyID < keys.size() && valueID < keys[keyID].names.size()) diff --git a/iniFile/iniFile.h b/iniFile/iniFile.h index 6b766ecf7..b3e5c7f5c 100644 --- a/iniFile/iniFile.h +++ b/iniFile/iniFile.h @@ -12,174 +12,177 @@ ////////////////////////////////////////////////////////////////////// /* - !! MODIFIED BY FAKETRUTH !! +!! MODIFIED BY FAKETRUTH and madmaxoft!! */ #ifndef CIniFile_H #define CIniFile_H -// C++ Includes -#include -#include -// C Includes -#include + + #define MAX_KEYNAME 128 #define MAX_VALUENAME 128 #define MAX_VALUEDATA 2048 + + + + class cIniFile //tolua_export { //tolua_export private: - bool caseInsensitive; - std::string path; - struct key { - std::vector names; - std::vector values; + bool caseInsensitive; + std::string path; + struct key { + std::vector names; + std::vector values; + std::vector comments; + }; + std::vector keys; + std::vector names; std::vector comments; - }; - std::vector keys; - std::vector names; - std::vector comments; - std::string CheckCase( std::string s) const; + std::string CheckCase( std::string s) const; public: - enum errors{ noID = -1}; //tolua_export - cIniFile( const std::string iniPath = ""); //tolua_export - virtual ~cIniFile() {} - - // Sets whether or not keynames and valuenames should be case sensitive. - // The default is case insensitive. - void CaseSensitive() {caseInsensitive = false;} //tolua_export - void CaseInsensitive() {caseInsensitive = true;} //tolua_export - - // Sets path of ini file to read and write from. - void Path(const std::string & newPath) {path = newPath;} //tolua_export - std::string Path() const {return path;} //tolua_export - void SetPath(const std::string & newPath) {Path( newPath);} //tolua_export - - // Reads ini file specified using path. - // Returns true if successful, false otherwise. - bool ReadFile(); //tolua_export - - // Writes data stored in class to ini file. - bool WriteFile(); //tolua_export - - // Deletes all stored ini data. - void Erase(); //tolua_export - void Clear() {Erase();} //tolua_export - void Reset() {Erase();} //tolua_export - - // Returns index of specified key, or noID if not found. - long FindKey( const std::string & keyname) const; //tolua_export - - // Returns index of specified value, in the specified key, or noID if not found. - long FindValue( const unsigned keyID, const std::string & valuename) const; //tolua_export - - // Returns number of keys currently in the ini. - unsigned NumKeys() const {return names.size();} //tolua_export - unsigned GetNumKeys() const {return NumKeys();} //tolua_export - - // Add a key name. - unsigned AddKeyName( const std::string & keyname); //tolua_export - - // Returns key names by index. - std::string KeyName( const unsigned keyID) const; //tolua_export - std::string GetKeyName( const unsigned keyID) const {return KeyName(keyID);} //tolua_export - - // Returns number of values stored for specified key. - unsigned NumValues( const std::string & keyname); //tolua_export - unsigned GetNumValues( const std::string & keyname) {return NumValues( keyname);} //tolua_export - unsigned NumValues( const unsigned keyID); //tolua_export - unsigned GetNumValues( const unsigned keyID) {return NumValues( keyID);} //tolua_export - - // Returns value name by index for a given keyname or keyID. - std::string ValueName( const std::string & keyname, const unsigned valueID) const; //tolua_export - std::string GetValueName( const std::string & keyname, const unsigned valueID) const { //tolua_export - return ValueName( keyname, valueID); - } //tolua_export - std::string ValueName( const unsigned keyID, const unsigned valueID) const; //tolua_export - std::string GetValueName( const unsigned keyID, const unsigned valueID) const { //tolua_export - return ValueName( keyID, valueID); - } //tolua_export - - // Gets value of [keyname] valuename =. - // Overloaded to return string, int, and double. - // Returns defValue if key/value not found. - std::string GetValue( const std::string & keyname, const std::string & valuename, const std::string & defValue = "") const; //tolua_export - std::string GetValue( const unsigned keyID, const unsigned valueID, const std::string & defValue = "") const; //tolua_export - int GetValueI( const std::string & keyname, const std::string & valuename, const int defValue = 0) const; //tolua_export - bool GetValueB( const std::string & keyname, const std::string & valuename, const bool defValue = false) const { //tolua_export - return ( GetValueI( keyname, valuename, int( defValue)) > 0); - } //tolua_export - double GetValueF( const std::string & keyname, const std::string & valuename, const double defValue = 0.0) const; //tolua_export - // This is a variable length formatted GetValue routine. All these voids - // are required because there is no vsscanf() like there is a vsprintf(). - // Only a maximum of 8 variable can be read. - unsigned GetValueV( const std::string & keyname, const std::string & valuename, char *format, - void *v1 = 0, void *v2 = 0, void *v3 = 0, void *v4 = 0, - void *v5 = 0, void *v6 = 0, void *v7 = 0, void *v8 = 0, - void *v9 = 0, void *v10 = 0, void *v11 = 0, void *v12 = 0, - void *v13 = 0, void *v14 = 0, void *v15 = 0, void *v16 = 0); - - // Sets value of [keyname] valuename =. - // Specify the optional paramter as false (0) if you do not want it to create - // the key if it doesn't exist. Returns true if data entered, false otherwise. - // Overloaded to accept string, int, and double. - bool SetValue( const unsigned keyID, const unsigned valueID, const std::string & value); //tolua_export - bool SetValue( const std::string & keyname, const std::string & valuename, const std::string & value, const bool create = true); //tolua_export - bool SetValueI( const std::string & keyname, const std::string & valuename, const int value, const bool create = true); //tolua_export - bool SetValueB( const std::string & keyname, const std::string & valuename, const bool value, const bool create = true) { //tolua_export - return SetValueI( keyname, valuename, int(value), create); - } //tolua_export - bool SetValueF( const std::string & keyname, const std::string & valuename, const double value, const bool create = true); //tolua_export - bool SetValueV( const std::string & keyname, const std::string & valuename, char *format, ...); - - // Deletes specified value. - // Returns true if value existed and deleted, false otherwise. - bool DeleteValueByID( const unsigned keyID, const unsigned valueID ); //tolua_export - bool DeleteValue( const std::string & keyname, const std::string & valuename); //tolua_export - - // Deletes specified key and all values contained within. - // Returns true if key existed and deleted, false otherwise. - bool DeleteKey(const std::string & keyname); //tolua_export - - // Header comment functions. - // Header comments are those comments before the first key. - // - // Number of header comments. - unsigned NumHeaderComments() {return comments.size();} //tolua_export - // Add a header comment. - void HeaderComment( const std::string & comment); //tolua_export - // Return a header comment. - std::string HeaderComment( const unsigned commentID) const; //tolua_export - // Delete a header comment. - bool DeleteHeaderComment( unsigned commentID); //tolua_export - // Delete all header comments. - void DeleteHeaderComments() {comments.clear();} //tolua_export - - // Key comment functions. - // Key comments are those comments within a key. Any comments - // defined within value names will be added to this list. Therefore, - // these comments will be moved to the top of the key definition when - // the CIniFile::WriteFile() is called. - // - // Number of key comments. - unsigned NumKeyComments( const unsigned keyID) const; //tolua_export - unsigned NumKeyComments( const std::string & keyname) const; //tolua_export - // Add a key comment. - bool KeyComment( const unsigned keyID, const std::string & comment); //tolua_export - bool KeyComment( const std::string & keyname, const std::string & comment); //tolua_export - // Return a key comment. - std::string KeyComment( const unsigned keyID, const unsigned commentID) const; //tolua_export - std::string KeyComment( const std::string & keyname, const unsigned commentID) const; //tolua_export - // Delete a key comment. - bool DeleteKeyComment( const unsigned keyID, const unsigned commentID); //tolua_export - bool DeleteKeyComment( const std::string & keyname, const unsigned commentID); //tolua_export - // Delete all comments for a key. - bool DeleteKeyComments( const unsigned keyID); //tolua_export - bool DeleteKeyComments( const std::string & keyname); //tolua_export + enum errors{ noID = -1}; //tolua_export + cIniFile( const std::string iniPath = ""); //tolua_export + virtual ~cIniFile() {} + + // Sets whether or not keynames and valuenames should be case sensitive. + // The default is case insensitive. + void CaseSensitive() {caseInsensitive = false;} //tolua_export + void CaseInsensitive() {caseInsensitive = true;} //tolua_export + + // Sets path of ini file to read and write from. + void Path(const std::string & newPath) {path = newPath;} //tolua_export + std::string Path() const {return path;} //tolua_export + void SetPath(const std::string & newPath) {Path( newPath);} //tolua_export + + // Reads ini file specified using path. + // Returns true if successful, false otherwise. + bool ReadFile(); //tolua_export + + // Writes data stored in class to ini file. + bool WriteFile(); //tolua_export + + // Deletes all stored ini data. + void Erase(); //tolua_export + void Clear() {Erase();} //tolua_export + void Reset() {Erase();} //tolua_export + + // Returns index of specified key, or noID if not found. + long FindKey( const std::string & keyname) const; //tolua_export + + // Returns index of specified value, in the specified key, or noID if not found. + long FindValue( const unsigned keyID, const std::string & valuename) const; //tolua_export + + // Returns number of keys currently in the ini. + unsigned NumKeys() const {return names.size();} //tolua_export + unsigned GetNumKeys() const {return NumKeys();} //tolua_export + + // Add a key name. + unsigned AddKeyName( const std::string & keyname); //tolua_export + + // Returns key names by index. + std::string KeyName( const unsigned keyID) const; //tolua_export + std::string GetKeyName( const unsigned keyID) const {return KeyName(keyID);} //tolua_export + + // Returns number of values stored for specified key. + unsigned NumValues( const std::string & keyname); //tolua_export + unsigned GetNumValues( const std::string & keyname) {return NumValues( keyname);} //tolua_export + unsigned NumValues( const unsigned keyID); //tolua_export + unsigned GetNumValues( const unsigned keyID) {return NumValues( keyID);} //tolua_export + + // Returns value name by index for a given keyname or keyID. + std::string ValueName( const std::string & keyname, const unsigned valueID) const; //tolua_export + std::string GetValueName( const std::string & keyname, const unsigned valueID) const { //tolua_export + return ValueName( keyname, valueID); + } //tolua_export + std::string ValueName( const unsigned keyID, const unsigned valueID) const; //tolua_export + std::string GetValueName( const unsigned keyID, const unsigned valueID) const { //tolua_export + return ValueName( keyID, valueID); + } //tolua_export + + // Gets value of [keyname] valuename =. + // Overloaded to return string, int, and double. + // Returns defValue if key/value not found. + std::string GetValue( const std::string & keyname, const std::string & valuename, const std::string & defValue = "") const; //tolua_export + std::string GetValue( const unsigned keyID, const unsigned valueID, const std::string & defValue = "") const; //tolua_export + int GetValueI( const std::string & keyname, const std::string & valuename, const int defValue = 0) const; //tolua_export + bool GetValueB( const std::string & keyname, const std::string & valuename, const bool defValue = false) const { //tolua_export + return ( GetValueI( keyname, valuename, int( defValue)) > 0); + } //tolua_export + double GetValueF( const std::string & keyname, const std::string & valuename, const double defValue = 0.0) const; //tolua_export + + // This is a variable length formatted GetValue routine. All these voids + // are required because there is no vsscanf() like there is a vsprintf(). + // Only a maximum of 8 variable can be read. + // NOTE: do not use this function, instead get the string value and parse it yourself + OBSOLETE unsigned GetValueV( const std::string & keyname, const std::string & valuename, char *format, + void *v1 = 0, void *v2 = 0, void *v3 = 0, void *v4 = 0, + void *v5 = 0, void *v6 = 0, void *v7 = 0, void *v8 = 0, + void *v9 = 0, void *v10 = 0, void *v11 = 0, void *v12 = 0, + void *v13 = 0, void *v14 = 0, void *v15 = 0, void *v16 = 0); + + // Sets value of [keyname] valuename =. + // Specify the optional paramter as false (0) if you do not want it to create + // the key if it doesn't exist. Returns true if data entered, false otherwise. + // Overloaded to accept string, int, and double. + bool SetValue( const unsigned keyID, const unsigned valueID, const std::string & value); //tolua_export + bool SetValue( const std::string & keyname, const std::string & valuename, const std::string & value, const bool create = true); //tolua_export + bool SetValueI( const std::string & keyname, const std::string & valuename, const int value, const bool create = true); //tolua_export + bool SetValueB( const std::string & keyname, const std::string & valuename, const bool value, const bool create = true) { //tolua_export + return SetValueI( keyname, valuename, int(value), create); + } //tolua_export + bool SetValueF( const std::string & keyname, const std::string & valuename, const double value, const bool create = true); //tolua_export + bool SetValueV( const std::string & keyname, const std::string & valuename, char *format, ...); + + // Deletes specified value. + // Returns true if value existed and deleted, false otherwise. + bool DeleteValueByID( const unsigned keyID, const unsigned valueID ); //tolua_export + bool DeleteValue( const std::string & keyname, const std::string & valuename); //tolua_export + + // Deletes specified key and all values contained within. + // Returns true if key existed and deleted, false otherwise. + bool DeleteKey(const std::string & keyname); //tolua_export + + // Header comment functions. + // Header comments are those comments before the first key. + // + // Number of header comments. + unsigned NumHeaderComments() {return comments.size();} //tolua_export + // Add a header comment. + void HeaderComment( const std::string & comment); //tolua_export + // Return a header comment. + std::string HeaderComment( const unsigned commentID) const; //tolua_export + // Delete a header comment. + bool DeleteHeaderComment( unsigned commentID); //tolua_export + // Delete all header comments. + void DeleteHeaderComments() {comments.clear();} //tolua_export + + // Key comment functions. + // Key comments are those comments within a key. Any comments + // defined within value names will be added to this list. Therefore, + // these comments will be moved to the top of the key definition when + // the CIniFile::WriteFile() is called. + // + // Number of key comments. + unsigned NumKeyComments( const unsigned keyID) const; //tolua_export + unsigned NumKeyComments( const std::string & keyname) const; //tolua_export + // Add a key comment. + bool KeyComment( const unsigned keyID, const std::string & comment); //tolua_export + bool KeyComment( const std::string & keyname, const std::string & comment); //tolua_export + // Return a key comment. + std::string KeyComment( const unsigned keyID, const unsigned commentID) const; //tolua_export + std::string KeyComment( const std::string & keyname, const unsigned commentID) const; //tolua_export + // Delete a key comment. + bool DeleteKeyComment( const unsigned keyID, const unsigned commentID); //tolua_export + bool DeleteKeyComment( const std::string & keyname, const unsigned commentID); //tolua_export + // Delete all comments for a key. + bool DeleteKeyComments( const unsigned keyID); //tolua_export + bool DeleteKeyComments( const std::string & keyname); //tolua_export }; //tolua_export #endif -- cgit v1.2.3