summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llapr.cpp24
-rw-r--r--indra/llcommon/llapr.h24
-rw-r--r--indra/llcommon/llassettype.cpp16
-rw-r--r--indra/llcommon/llassettype.h6
-rw-r--r--indra/llcommon/llchat.h6
-rw-r--r--indra/llcommon/llcrc.cpp4
-rw-r--r--indra/llcommon/llcrc.h2
-rw-r--r--indra/llcommon/llerror.cpp8
-rw-r--r--indra/llcommon/llevent.cpp2
-rw-r--r--indra/llcommon/llfile.cpp44
-rw-r--r--indra/llcommon/llfile.h74
-rw-r--r--indra/llcommon/llfixedbuffer.cpp2
-rw-r--r--indra/llcommon/llfixedbuffer.h2
-rw-r--r--indra/llcommon/llliveappconfig.cpp2
-rw-r--r--indra/llcommon/lllivefile.cpp2
-rw-r--r--indra/llcommon/llprocessor.cpp4
-rw-r--r--indra/llcommon/llprocessor.h2
-rw-r--r--indra/llcommon/llsd.h2
-rw-r--r--indra/llcommon/llsdserialize.cpp3
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp6
-rw-r--r--indra/llcommon/llsdutil.cpp9
-rw-r--r--indra/llcommon/llsecondlifeurls.cpp70
-rw-r--r--indra/llcommon/llsecondlifeurls.h30
-rw-r--r--indra/llcommon/llstring.cpp264
-rw-r--r--indra/llcommon/llstring.h208
-rw-r--r--indra/llcommon/llsys.cpp56
-rw-r--r--indra/llcommon/llsys.h4
-rw-r--r--indra/llcommon/lltimer.cpp6
-rw-r--r--indra/llcommon/lltimer.h4
-rw-r--r--indra/llcommon/lluuid.cpp108
-rw-r--r--indra/llcommon/lluuid.h5
-rw-r--r--indra/llcommon/metapropertyt.h13
-rw-r--r--indra/llcommon/u64.cpp36
-rw-r--r--indra/llcommon/u64.h9
34 files changed, 421 insertions, 636 deletions
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index 5be3919898..e83473216a 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -129,7 +129,7 @@ void ll_apr_assert_status(apr_status_t status)
}
// File I/O
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep, apr_pool_t* pool)
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, S32* sizep, apr_pool_t* pool)
{
apr_file_t* apr_file;
apr_status_t s;
@@ -160,15 +160,15 @@ apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* s
return apr_file;
}
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep)
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, S32* sizep)
{
return ll_apr_file_open(filename, flags, sizep, NULL);
}
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, apr_pool_t* pool)
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool)
{
return ll_apr_file_open(filename, flags, NULL, pool);
}
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags)
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags)
{
return ll_apr_file_open(filename, flags, NULL, NULL);
}
@@ -188,7 +188,7 @@ S32 ll_apr_file_read(apr_file_t* apr_file, void *buf, S32 nbytes)
}
}
-S32 ll_apr_file_read_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes)
+S32 ll_apr_file_read_ex(const std::string& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes)
{
if (pool == NULL) pool = gAPRPoolp;
apr_file_t* filep = ll_apr_file_open(filename, APR_READ|APR_BINARY, pool);
@@ -230,7 +230,7 @@ S32 ll_apr_file_write(apr_file_t* apr_file, const void *buf, S32 nbytes)
}
}
-S32 ll_apr_file_write_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes)
+S32 ll_apr_file_write_ex(const std::string& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes)
{
if (pool == NULL) pool = gAPRPoolp;
apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;
@@ -287,7 +287,7 @@ S32 ll_apr_file_seek(apr_file_t* apr_file, apr_seek_where_t where, S32 offset)
}
}
-bool ll_apr_file_remove(const LLString& filename, apr_pool_t* pool)
+bool ll_apr_file_remove(const std::string& filename, apr_pool_t* pool)
{
apr_status_t s;
if (pool == NULL) pool = gAPRPoolp;
@@ -301,7 +301,7 @@ bool ll_apr_file_remove(const LLString& filename, apr_pool_t* pool)
return true;
}
-bool ll_apr_file_rename(const LLString& filename, const LLString& newname, apr_pool_t* pool)
+bool ll_apr_file_rename(const std::string& filename, const std::string& newname, apr_pool_t* pool)
{
apr_status_t s;
if (pool == NULL) pool = gAPRPoolp;
@@ -315,7 +315,7 @@ bool ll_apr_file_rename(const LLString& filename, const LLString& newname, apr_p
return true;
}
-bool ll_apr_file_exists(const LLString& filename, apr_pool_t* pool)
+bool ll_apr_file_exists(const std::string& filename, apr_pool_t* pool)
{
apr_file_t* apr_file;
apr_status_t s;
@@ -332,7 +332,7 @@ bool ll_apr_file_exists(const LLString& filename, apr_pool_t* pool)
}
}
-S32 ll_apr_file_size(const LLString& filename, apr_pool_t* pool)
+S32 ll_apr_file_size(const std::string& filename, apr_pool_t* pool)
{
apr_file_t* apr_file;
apr_finfo_t info;
@@ -358,7 +358,7 @@ S32 ll_apr_file_size(const LLString& filename, apr_pool_t* pool)
}
}
-bool ll_apr_dir_make(const LLString& dirname, apr_pool_t* pool)
+bool ll_apr_dir_make(const std::string& dirname, apr_pool_t* pool)
{
apr_status_t s;
if (pool == NULL) pool = gAPRPoolp;
@@ -372,7 +372,7 @@ bool ll_apr_dir_make(const LLString& dirname, apr_pool_t* pool)
return true;
}
-bool ll_apr_dir_remove(const LLString& dirname, apr_pool_t* pool)
+bool ll_apr_dir_remove(const std::string& dirname, apr_pool_t* pool)
{
apr_status_t s;
if (pool == NULL) pool = gAPRPoolp;
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 3927d5f014..403d504932 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -130,24 +130,24 @@ typedef LLAtomic32<S32> LLAtomicS32;
#define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep, apr_pool_t* pool);
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep);
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, apr_pool_t* pool);
-apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags);
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, S32* sizep, apr_pool_t* pool);
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, S32* sizep);
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool);
+apr_file_t* ll_apr_file_open(const std::string& filename, apr_int32_t flags);
// Returns actual offset, -1 if seek fails
S32 ll_apr_file_seek(apr_file_t* apr_file, apr_seek_where_t where, S32 offset);
// Returns bytes read/written, 0 if read/write fails:
S32 ll_apr_file_read(apr_file_t* apr_file, void* buf, S32 nbytes);
-S32 ll_apr_file_read_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes);
+S32 ll_apr_file_read_ex(const std::string& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes);
S32 ll_apr_file_write(apr_file_t* apr_file, const void* buf, S32 nbytes);
-S32 ll_apr_file_write_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes);
+S32 ll_apr_file_write_ex(const std::string& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes);
// returns false if failure:
-bool ll_apr_file_remove(const LLString& filename, apr_pool_t* pool = NULL);
-bool ll_apr_file_rename(const LLString& filename, const LLString& newname, apr_pool_t* pool = NULL);
-bool ll_apr_file_exists(const LLString& filename, apr_pool_t* pool = NULL);
-S32 ll_apr_file_size(const LLString& filename, apr_pool_t* pool = NULL);
-bool ll_apr_dir_make(const LLString& dirname, apr_pool_t* pool = NULL);
-bool ll_apr_dir_remove(const LLString& dirname, apr_pool_t* pool = NULL);
+bool ll_apr_file_remove(const std::string& filename, apr_pool_t* pool = NULL);
+bool ll_apr_file_rename(const std::string& filename, const std::string& newname, apr_pool_t* pool = NULL);
+bool ll_apr_file_exists(const std::string& filename, apr_pool_t* pool = NULL);
+S32 ll_apr_file_size(const std::string& filename, apr_pool_t* pool = NULL);
+bool ll_apr_dir_make(const std::string& dirname, apr_pool_t* pool = NULL);
+bool ll_apr_dir_remove(const std::string& dirname, apr_pool_t* pool = NULL);
/**
* @brief Function which approprately logs error or remains quiet on
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 06504b53fd..368c85acb0 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -75,7 +75,7 @@ asset_info_t asset_types[] =
LLAssetType::EType LLAssetType::getType(const std::string& sin)
{
std::string s = sin;
- LLString::toUpper(s);
+ LLStringUtil::toUpper(s);
for (S32 idx = 0; ;idx++)
{
asset_info_t* info = asset_types + idx;
@@ -181,9 +181,14 @@ const char* LLAssetType::lookup( LLAssetType::EType type )
// static
LLAssetType::EType LLAssetType::lookup( const char* name )
{
+ return lookup(ll_safe_string(name));
+}
+
+LLAssetType::EType LLAssetType::lookup( const std::string& name )
+{
for( S32 i = 0; i < AT_COUNT; i++ )
{
- if( 0 == strcmp(name, mAssetTypeNames[i]) )
+ if( name == mAssetTypeNames[i] )
{
// match
return (EType)i;
@@ -208,9 +213,14 @@ const char* LLAssetType::lookupHumanReadable(LLAssetType::EType type)
// static
LLAssetType::EType LLAssetType::lookupHumanReadable( const char* name )
{
+ return lookupHumanReadable(ll_safe_string(name));
+}
+
+LLAssetType::EType LLAssetType::lookupHumanReadable( const std::string& name )
+{
for( S32 i = 0; i < AT_COUNT; i++ )
{
- if( 0 == strcmp(name, mAssetTypeHumanNames[i]) )
+ if( name == mAssetTypeHumanNames[i] )
{
// match
return (EType)i;
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index f71e0b98cd..ad254703f0 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -145,11 +145,13 @@ public:
};
// machine transation between type and strings
- static EType lookup(const char* name);
+ static EType lookup(const char* name); // safe conversion to std::string, *TODO: deprecate
+ static EType lookup(const std::string& name);
static const char* lookup(EType type);
// translation from a type to a human readable form.
- static EType lookupHumanReadable( const char* name );
+ static EType lookupHumanReadable( const char* name ); // safe conversion to std::string, *TODO: deprecate
+ static EType lookupHumanReadable( const std::string& name );
static const char* lookupHumanReadable(EType type);
static EDragAndDropType lookupDragAndDropType( EType );
diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index 0ae16380b4..b6f84b25b5 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -68,7 +68,7 @@ typedef enum e_chat_audible_level
class LLChat
{
public:
- LLChat(const LLString& text = LLString::null)
+ LLChat(const std::string& text = LLStringUtil::null)
: mText(text),
mFromName(),
mFromID(),
@@ -80,8 +80,8 @@ public:
mPosAgent()
{ }
- LLString mText; // UTF-8 line of text
- LLString mFromName; // agent or object name
+ std::string mText; // UTF-8 line of text
+ std::string mFromName; // agent or object name
LLUUID mFromID; // agent id or object id
EChatSourceType mSourceType;
EChatType mChatType;
diff --git a/indra/llcommon/llcrc.cpp b/indra/llcommon/llcrc.cpp
index 0836ccb66b..ea90b4f22f 100644
--- a/indra/llcommon/llcrc.cpp
+++ b/indra/llcommon/llcrc.cpp
@@ -163,9 +163,9 @@ void LLCRC::update(const U8* buffer, size_t buffer_size)
}
}
-void LLCRC::update(const char* filename)
+void LLCRC::update(const std::string& filename)
{
- if (!filename)
+ if (filename.empty())
{
llerrs << "No filename specified" << llendl;
return;
diff --git a/indra/llcommon/llcrc.h b/indra/llcommon/llcrc.h
index 287c1fbc41..8eab84799f 100644
--- a/indra/llcommon/llcrc.h
+++ b/indra/llcommon/llcrc.h
@@ -60,7 +60,7 @@ public:
U32 getCRC() const;
void update(U8 next_byte);
void update(const U8* buffer, size_t buffer_size);
- void update(const char *filename);
+ void update(const std::string& filename);
#ifdef _DEBUG
// This function runs tests to make sure the crc is
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 1d85bc0e70..b3d3122397 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -102,7 +102,7 @@ namespace {
public:
RecordToFile(const std::string& filename)
{
- mFile.open(filename.c_str(), llofstream::out | llofstream::app);
+ mFile.open(filename, llofstream::out | llofstream::app);
if (!mFile)
{
llinfos << "Error setting log file to " << filename << llendl;
@@ -196,7 +196,7 @@ namespace {
virtual void recordMessage(LLError::ELevel level,
const std::string& message)
{
- mBuffer.addLine(message.c_str());
+ mBuffer.addLine(message);
}
private:
@@ -305,7 +305,7 @@ namespace
std::string file = dirBase + "logcontrol-dev.xml";
llstat stat_info;
- if (LLFile::stat(file.c_str(), &stat_info)) {
+ if (LLFile::stat(file, &stat_info)) {
// NB: stat returns non-zero if it can't read the file, for example
// if it doesn't exist. LLFile has no better abstraction for
// testing for file existence.
@@ -321,7 +321,7 @@ namespace
LLSD configuration;
{
- llifstream file(filename().c_str());
+ llifstream file(filename());
if (file.is_open())
{
LLSDSerialize::fromXML(configuration, file);
diff --git a/indra/llcommon/llevent.cpp b/indra/llcommon/llevent.cpp
index 292d0909a4..4f3962154e 100644
--- a/indra/llcommon/llevent.cpp
+++ b/indra/llcommon/llevent.cpp
@@ -219,7 +219,7 @@ std::vector<LLListenerEntry> LLSimpleDispatcher::getListeners() const
bool LLSimpleDispatcher::fireEvent(LLPointer<LLEvent> event, LLSD filter)
{
std::vector<LLListenerEntry>::iterator itor;
- LLString filter_string = filter.asString();
+ std::string filter_string = filter.asString();
for (itor=mListeners.begin(); itor!=mListeners.end(); ++itor)
{
LLListenerEntry& entry = *itor;
diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp
index 6b8f8e68c5..8f7a8ded63 100644
--- a/indra/llcommon/llfile.cpp
+++ b/indra/llcommon/llfile.cpp
@@ -44,7 +44,7 @@
using namespace std;
// static
-int LLFile::mkdir(const char* dirname, int perms)
+int LLFile::mkdir(const std::string& dirname, int perms)
{
#if LL_WINDOWS
// permissions are ignored on Windows
@@ -52,12 +52,12 @@ int LLFile::mkdir(const char* dirname, int perms)
llutf16string utf16dirname = utf8str_to_utf16str(utf8dirname);
return _wmkdir(utf16dirname.c_str());
#else
- return ::mkdir(dirname, (mode_t)perms);
+ return ::mkdir(dirname.c_str(), (mode_t)perms);
#endif
}
// static
-int LLFile::rmdir(const char* dirname)
+int LLFile::rmdir(const std::string& dirname)
{
#if LL_WINDOWS
// permissions are ignored on Windows
@@ -65,29 +65,29 @@ int LLFile::rmdir(const char* dirname)
llutf16string utf16dirname = utf8str_to_utf16str(utf8dirname);
return _wrmdir(utf16dirname.c_str());
#else
- return ::rmdir(dirname);
+ return ::rmdir(dirname.c_str());
#endif
}
// static
-LLFILE* LLFile::fopen(const char* filename, const char* mode) /* Flawfinder: ignore */
+LLFILE* LLFile::fopen(const std::string& filename, const char* mode) /* Flawfinder: ignore */
{
#if LL_WINDOWS
std::string utf8filename = filename;
- std::string utf8mode = mode;
+ std::string utf8mode = std::string(mode);
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
llutf16string utf16mode = utf8str_to_utf16str(utf8mode);
return _wfopen(utf16filename.c_str(),utf16mode.c_str());
#else
- return ::fopen(filename,mode); /* Flawfinder: ignore */
+ return ::fopen(filename.c_str(),mode); /* Flawfinder: ignore */
#endif
}
-LLFILE* LLFile::_fsopen(const char* filename, const char* mode, int sharingFlag)
+LLFILE* LLFile::_fsopen(const std::string& filename, const char* mode, int sharingFlag)
{
#if LL_WINDOWS
std::string utf8filename = filename;
- std::string utf8mode = mode;
+ std::string utf8mode = std::string(mode);
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
llutf16string utf16mode = utf8str_to_utf16str(utf8mode);
return _wfsopen(utf16filename.c_str(),utf16mode.c_str(),sharingFlag);
@@ -97,18 +97,18 @@ LLFILE* LLFile::_fsopen(const char* filename, const char* mode, int sharingFlag)
#endif
}
-int LLFile::remove(const char* filename)
+int LLFile::remove(const std::string& filename)
{
#if LL_WINDOWS
std::string utf8filename = filename;
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
return _wremove(utf16filename.c_str());
#else
- return ::remove(filename);
+ return ::remove(filename.c_str());
#endif
}
-int LLFile::rename(const char* filename, const char* newname)
+int LLFile::rename(const std::string& filename, const std::string& newname)
{
#if LL_WINDOWS
std::string utf8filename = filename;
@@ -117,29 +117,29 @@ int LLFile::rename(const char* filename, const char* newname)
llutf16string utf16newname = utf8str_to_utf16str(utf8newname);
return _wrename(utf16filename.c_str(),utf16newname.c_str());
#else
- return ::rename(filename,newname);
+ return ::rename(filename.c_str(),newname.c_str());
#endif
}
-int LLFile::stat(const char* filename, llstat* filestatus)
+int LLFile::stat(const std::string& filename, llstat* filestatus)
{
#if LL_WINDOWS
std::string utf8filename = filename;
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
return _wstat(utf16filename.c_str(),filestatus);
#else
- return ::stat(filename,filestatus);
+ return ::stat(filename.c_str(),filestatus);
#endif
}
-bool LLFile::isdir(const char *filename)
+bool LLFile::isdir(const std::string& filename)
{
llstat st;
return stat(filename, &st) == 0 && S_ISDIR(st.st_mode);
}
-bool LLFile::isfile(const char *filename)
+bool LLFile::isfile(const std::string& filename)
{
llstat st;
@@ -181,7 +181,7 @@ const char *LLFile::tmpdir()
#if USE_LLFILESTREAMS
-LLFILE * LLFile::_Fiopen(const char *filename, std::ios::openmode mode,int) // protection currently unused
+LLFILE * LLFile::_Fiopen(const std::string& filename, std::ios::openmode mode,int) // protection currently unused
{ // open a file
static const char *mods[] =
{ // fopen mode strings corresponding to valid[i]
@@ -250,7 +250,7 @@ void llifstream::close()
}
}
-void llifstream::open(const char* _Filename, /* Flawfinder: ignore */
+void llifstream::open(const std::string& _Filename, /* Flawfinder: ignore */
ios_base::openmode _Mode,
int _Prot)
{ // open a C stream with specified mode
@@ -282,7 +282,7 @@ llifstream::~llifstream()
delete _Filebuffer;
}
-llifstream::llifstream(const char *_Filename,
+llifstream::llifstream(const std::string& _Filename,
ios_base::openmode _Mode,
int _Prot)
: std::basic_istream< char , std::char_traits< char > >(NULL,true),_Filebuffer(NULL),_ShouldClose(false)
@@ -301,7 +301,7 @@ bool llofstream::is_open() const
return false;
}
-void llofstream::open(const char* _Filename, /* Flawfinder: ignore */
+void llofstream::open(const std::string& _Filename, /* Flawfinder: ignore */
ios_base::openmode _Mode,
int _Prot)
{ // open a C stream with specified mode
@@ -327,7 +327,7 @@ void llofstream::close()
}
}
-llofstream::llofstream(const char *_Filename,
+llofstream::llofstream(const std::string& _Filename,
std::ios_base::openmode _Mode,
int _Prot)
: std::basic_ostream<char,std::char_traits < char > >(NULL,true),_Filebuffer(NULL),_ShouldClose(false)
diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h
index bd51ac2aa9..a196dad814 100644
--- a/indra/llcommon/llfile.h
+++ b/indra/llcommon/llfile.h
@@ -67,24 +67,27 @@ typedef struct stat llstat;
# define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
#endif
+#include "llstring.h" // safe char* -> std::string conversion
+
class LLFile
{
public:
// All these functions take UTF8 path/filenames.
- static LLFILE* fopen(const char* filename,const char* accessmode); /* Flawfinder: ignore */
- static LLFILE* _fsopen(const char* filename,const char* accessmode,int sharingFlag);
+ static LLFILE* fopen(const std::string& filename,const char* accessmode); /* Flawfinder: ignore */
+ static LLFILE* _fsopen(const std::string& filename,const char* accessmode,int sharingFlag);
// perms is a permissions mask like 0777 or 0700. In most cases it will
// be overridden by the user's umask. It is ignored on Windows.
- static int mkdir(const char* filename, int perms = 0700);
-
- static int rmdir(const char* filename);
- static int remove(const char* filename);
- static int rename(const char* filename,const char* newname);
- static int stat(const char* filename,llstat* file_status);
- static bool isdir(const char* filename);
- static bool isfile(const char* filename);
- static LLFILE * _Fiopen(const char *filename, std::ios::openmode mode,int); // protection currently unused
+ static int mkdir(const std::string& filename, int perms = 0700);
+
+ static int rmdir(const std::string& filename);
+ static int remove(const std::string& filename);
+ static int rename(const std::string& filename,const std::string& newname);
+ static int stat(const std::string& filename,llstat* file_status);
+ static bool isdir(const std::string& filename);
+ static bool isfile(const std::string& filename);
+ static LLFILE * _Fiopen(const std::string& filename, std::ios::openmode mode,int); // protection currently unused
+
static const char * tmpdir();
};
@@ -104,7 +107,7 @@ public:
{ // construct unopened
}
- explicit llifstream(const char *_Filename,
+ explicit llifstream(const std::string& _Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot);
@@ -121,7 +124,7 @@ public:
return _Filebuffer;
}
bool is_open() const;
- void open(const char* _Filename, /* Flawfinder: ignore */
+ void open(const std::string& _Filename, /* Flawfinder: ignore */
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot);
void close();
@@ -144,7 +147,7 @@ public:
{ // construct unopened
}
- explicit llofstream(const char *_Filename,
+ explicit llofstream(const std::string& _Filename,
std::ios_base::openmode _Mode = ios_base::out,
int _Prot = (int)std::ios_base::_Openprot);
@@ -165,7 +168,7 @@ public:
bool is_open() const;
- void open(const char *_Filename,ios_base::openmode _Mode = ios_base::out,int _Prot = (int)ios_base::_Openprot); /* Flawfinder: ignore */
+ void open(const std::string& _Filename,ios_base::openmode _Mode = ios_base::out,int _Prot = (int)ios_base::_Openprot); /* Flawfinder: ignore */
void close();
@@ -178,8 +181,45 @@ private:
#else
//Use standard file streams on non windows platforms
-#define llifstream std::ifstream
-#define llofstream std::ofstream
+//#define llifstream std::ifstream
+//#define llofstream std::ofstream
+
+class llifstream : public std::ifstream
+{
+public:
+ llifstream() : std::ifstream()
+ {
+ }
+
+ explicit llifstream(const std::string& _Filename, std::_Ios_Openmode _Mode = in)
+ : std::ifstream(_Filename.c_str(), _Mode)
+ {
+ }
+ void open(const std::string& _Filename, std::_Ios_Openmode _Mode = in) /* Flawfinder: ignore */
+ {
+ std::ifstream::open(_Filename.c_str(), _Mode);
+ }
+};
+
+
+class llofstream : public std::ofstream
+{
+public:
+ llofstream() : std::ofstream()
+ {
+ }
+
+ explicit llofstream(const std::string& _Filename, std::_Ios_Openmode _Mode = out)
+ : std::ofstream(_Filename.c_str(), _Mode)
+ {
+ }
+
+ void open(const std::string& _Filename, std::_Ios_Openmode _Mode = out) /* Flawfinder: ignore */
+ {
+ std::ofstream::open(_Filename.c_str(), _Mode);
+ }
+
+};
#endif
diff --git a/indra/llcommon/llfixedbuffer.cpp b/indra/llcommon/llfixedbuffer.cpp
index 44bb953f80..fde4db98a1 100644
--- a/indra/llcommon/llfixedbuffer.cpp
+++ b/indra/llcommon/llfixedbuffer.cpp
@@ -54,7 +54,7 @@ void LLFixedBuffer::clear()
}
-void LLFixedBuffer::addLine(const LLString& utf8line)
+void LLFixedBuffer::addLine(const std::string& utf8line)
{
LLWString wstring = utf8str_to_wstring(utf8line);
LLFixedBuffer::addLine(wstring);
diff --git a/indra/llcommon/llfixedbuffer.h b/indra/llcommon/llfixedbuffer.h
index 148c0e60db..0a23fb30d1 100644
--- a/indra/llcommon/llfixedbuffer.h
+++ b/indra/llcommon/llfixedbuffer.h
@@ -52,7 +52,7 @@ public:
std::deque<S32> mLineLengths;
void clear(); // Clear the buffer, and reset it.
- virtual void addLine(const LLString& utf8line);
+ virtual void addLine(const std::string& utf8line);
virtual void addLine(const LLWString& line);
// Get lines currently in the buffer, up to max_size chars, max_length lines
diff --git a/indra/llcommon/llliveappconfig.cpp b/indra/llcommon/llliveappconfig.cpp
index 76432770a3..418a34b662 100644
--- a/indra/llcommon/llliveappconfig.cpp
+++ b/indra/llcommon/llliveappconfig.cpp
@@ -51,7 +51,7 @@ void LLLiveAppConfig::loadFile()
{
llinfos << "LLLiveAppConfig::loadFile(): reading from "
<< filename() << llendl;
- llifstream file(filename().c_str());
+ llifstream file(filename());
LLSD config;
if (file.is_open())
{
diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp
index cb3ce0f8d2..8c625bce90 100644
--- a/indra/llcommon/lllivefile.cpp
+++ b/indra/llcommon/lllivefile.cpp
@@ -93,7 +93,7 @@ bool LLLiveFile::Impl::check()
// Stat the file to see if it exists and when it was last modified.
llstat stat_data;
- int res = LLFile::stat(mFilename.c_str(), &stat_data);
+ int res = LLFile::stat(mFilename, &stat_data);
if (res)
{
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 29a3cf32a8..87c6e57fdd 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -2216,12 +2216,12 @@ bool CProcessor::CPUInfoToText(char *strBuffer, unsigned int uiMaxLen)
return true;
}
-// bool CProcessor::WriteInfoTextFile(const char *strFilename)
+// bool CProcessor::WriteInfoTextFile(const std::string& strFilename)
// ===========================================================
// Takes use of CProcessor::CPUInfoToText and saves the string to a
// file
///////////////////////////////////////////////////////////////////
-bool CProcessor::WriteInfoTextFile(const char *strFilename)
+bool CProcessor::WriteInfoTextFile(const std::string& strFilename)
{
char buf[16384]; /* Flawfinder: ignore */
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index 6b966c5339..30bc14d6ce 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -188,7 +188,7 @@ public:
F64 GetCPUFrequency(unsigned int uiMeasureMSecs);
const ProcessorInfo *GetCPUInfo();
bool CPUInfoToText(char *strBuffer, unsigned int uiMaxLen);
- bool WriteInfoTextFile(const char *strFilename);
+ bool WriteInfoTextFile(const std::string& strFilename);
};
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 307d73608c..0382fb1360 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -394,7 +394,7 @@ std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
- as UTF8 encoded strings (making not like UUID<->String)
- as Base64 or Base96 encoded (making like UUID<->String)
- Conversions to std::string and LLUUID do not result in easy assignment
- to std::string, LLString or LLUUID due to non-unique conversion paths
+ to std::string, std::string or LLUUID due to non-unique conversion paths
*/
#endif // LL_LLSD_NEW_H
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 6bb75439a2..d496230dd8 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -1230,8 +1230,7 @@ void LLSDFormatter::realFormat(const std::string& format)
void LLSDFormatter::formatReal(LLSD::Real real, std::ostream& ostr) const
{
- char buffer[MAX_STRING]; /* Flawfinder: ignore */
- snprintf(buffer, MAX_STRING, mRealFormat.c_str(), real); /* Flawfinder: ignore */
+ std::string buffer = llformat(mRealFormat.c_str(), real);
ostr << buffer;
}
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index 592dfc9bc0..e23f765957 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -63,7 +63,7 @@ S32 LLSDXMLFormatter::format(const LLSD& data, std::ostream& ostr, U32 options)
{
std::streamsize old_precision = ostr.precision(25);
- LLString post = "";
+ std::string post;
if (options & LLSDFormatter::OPTIONS_PRETTY)
{
post = "\n";
@@ -79,8 +79,8 @@ S32 LLSDXMLFormatter::format(const LLSD& data, std::ostream& ostr, U32 options)
S32 LLSDXMLFormatter::format_impl(const LLSD& data, std::ostream& ostr, U32 options, U32 level) const
{
S32 format_count = 1;
- LLString pre = "";
- LLString post = "";
+ std::string pre;
+ std::string post;
if (options & LLSDFormatter::OPTIONS_PRETTY)
{
diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp
index 6f26447695..137539cc04 100644
--- a/indra/llcommon/llsdutil.cpp
+++ b/indra/llcommon/llsdutil.cpp
@@ -145,12 +145,11 @@ LLSD ll_binary_from_string(const LLSD& sd)
{
std::vector<U8> binary_value;
- LLString string_value = sd.asString();
- const char* string_p = string_value.c_str();
- while (*string_p)
+ std::string string_value = sd.asString();
+ for (std::string::iterator iter = string_value.begin();
+ iter != string_value.end(); ++iter)
{
- binary_value.push_back(*string_p);
- string_p++;
+ binary_value.push_back(*iter);
}
binary_value.push_back('\0');
diff --git a/indra/llcommon/llsecondlifeurls.cpp b/indra/llcommon/llsecondlifeurls.cpp
index bf09453c16..207d704f2a 100644
--- a/indra/llcommon/llsecondlifeurls.cpp
+++ b/indra/llcommon/llsecondlifeurls.cpp
@@ -32,56 +32,56 @@
#include "linden_common.h"
#include "llsecondlifeurls.h"
-const char CREATE_ACCOUNT_URL[] =
- "http://secondlife.com/registration/";
+const std::string CREATE_ACCOUNT_URL (
+ "http://secondlife.com/registration/");
-const char MANAGE_ACCOUNT[] =
- "http://secondlife.com/account/";
+const std::string MANAGE_ACCOUNT (
+ "http://secondlife.com/account/");
-const char AUCTION_URL[] =
- "http://secondlife.com/auctions/auction-detail.php?id=";
+const std::string AUCTION_URL (
+ "http://secondlife.com/auctions/auction-detail.php?id=");
-const char EVENTS_URL[] =
- "http://secondlife.com/events/";
+const std::string EVENTS_URL (
+ "http://secondlife.com/events/");
-const char TIER_UP_URL[] =
- "http://secondlife.com/app/landtier";
+const std::string TIER_UP_URL (
+ "http://secondlife.com/app/landtier");
-const char LAND_URL[] =
- "http://secondlife.com/app/landtier";
+const std::string LAND_URL (
+ "http://secondlife.com/app/landtier");
-const char UPGRADE_TO_PREMIUM_URL[] =
- "http://secondlife.com/app/upgrade/";
+const std::string UPGRADE_TO_PREMIUM_URL (
+ "http://secondlife.com/app/upgrade/");
-const char DIRECTX_9_URL[] =
- "http://secondlife.com/support/";
+const std::string DIRECTX_9_URL (
+ "http://secondlife.com/support/");
-const char AMD_AGP_URL[] =
- "http://secondlife.com/support/";
+const std::string AMD_AGP_URL (
+ "http://secondlife.com/support/");
-const char VIA_URL[] =
- "http://secondlife.com/support/";
+const std::string VIA_URL (
+ "http://secondlife.com/support/");
-const char SUPPORT_URL[] =
- "http://secondlife.com/support/";
+const std::string SUPPORT_URL (
+ "http://secondlife.com/support/");
-const char INTEL_CHIPSET_URL[] =
- "http://secondlife.com/support/";
+const std::string INTEL_CHIPSET_URL (
+ "http://secondlife.com/support/");
-const char SIS_CHIPSET_URL[] =
- "http://secondlife.com/support/";
+const std::string SIS_CHIPSET_URL (
+ "http://secondlife.com/support/");
-const char BLOGS_URL[] =
- "http://blog.secondlife.com/";
+const std::string BLOGS_URL (
+ "http://blog.secondlife.com/");
-const char BUY_CURRENCY_URL[] =
- "http://secondlife.com/app/currency/";
+const std::string BUY_CURRENCY_URL (
+ "http://secondlife.com/app/currency/");
-const char LSL_DOC_URL[] =
- "http://secondlife.com/app/lsldoc/";
+const std::string LSL_DOC_URL (
+ "http://secondlife.com/app/lsldoc/");
-const char SL_KB_URL[] =
- "http://secondlife.com/knowledgebase/";
+const std::string SL_KB_URL (
+ "http://secondlife.com/knowledgebase/");
-const char RELEASE_NOTES[] = "releasenotes.txt";
+const std::string RELEASE_NOTES ( "releasenotes.txt");
diff --git a/indra/llcommon/llsecondlifeurls.h b/indra/llcommon/llsecondlifeurls.h
index b8d8aa2402..0847c8378b 100644
--- a/indra/llcommon/llsecondlifeurls.h
+++ b/indra/llcommon/llsecondlifeurls.h
@@ -33,46 +33,46 @@
#define LL_LLSECONDLIFEURLS_H
// Account registration web page
-extern const char CREATE_ACCOUNT_URL[];
+extern const std::string CREATE_ACCOUNT_URL;
// Manage Account
-extern const char MANAGE_ACCOUNT[];
+extern const std::string MANAGE_ACCOUNT;
-extern const char AUCTION_URL[];
+extern const std::string AUCTION_URL;
-extern const char EVENTS_URL[];
+extern const std::string EVENTS_URL;
// Tier up to a new land level.
-extern const char TIER_UP_URL[];
+extern const std::string TIER_UP_URL;
// Tier up to a new land level.
-extern const char LAND_URL[];
+extern const std::string LAND_URL;
// Upgrade from basic membership to premium membership
-extern const char UPGRADE_TO_PREMIUM_URL[];
+extern const std::string UPGRADE_TO_PREMIUM_URL;
// How to get DirectX 9
-extern const char DIRECTX_9_URL[];
+extern const std::string DIRECTX_9_URL;
// Out of date VIA chipset
-extern const char VIA_URL[];
+extern const std::string VIA_URL;
// Support URL
-extern const char SUPPORT_URL[];
+extern const std::string SUPPORT_URL;
// Linden Blogs page
-extern const char BLOGS_URL[];
+extern const std::string BLOGS_URL;
// Currency page
-extern const char BUY_CURRENCY_URL[];
+extern const std::string BUY_CURRENCY_URL;
// LSL script wiki
-extern const char LSL_DOC_URL[];
+extern const std::string LSL_DOC_URL;
// SL KnowledgeBase page
-extern const char SL_KB_URL[];
+extern const std::string SL_KB_URL;
// Local Url Release Notes
-extern const char RELEASE_NOTES[];
+extern const std::string RELEASE_NOTES;
#endif
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 3a8756a31f..0d50919e26 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -1,6 +1,6 @@
/**
* @file llstring.cpp
- * @brief String utility functions and the LLString class.
+ * @brief String utility functions and the std::string class.
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -47,6 +47,12 @@ std::string ll_safe_string(const char* in)
return std::string();
}
+std::string ll_safe_string(const char* in, S32 maxlen)
+{
+ if(in) return std::string(in, maxlen);
+ return std::string();
+}
+
U8 hex_as_nybble(char hex)
{
if((hex >= '0') && (hex <= '9'))
@@ -65,7 +71,7 @@ U8 hex_as_nybble(char hex)
}
-bool _read_file_into_string(std::string& str, const char* filename)
+bool _read_file_into_string(std::string& str, const std::string& filename)
{
llifstream ifs(filename, llifstream::binary);
if (!ifs.is_open())
@@ -174,20 +180,6 @@ S32 utf16chars_to_wchar(const U16* inchars, llwchar* outchar)
return inchars - base;
}
-S32 utf16chars_to_utf8chars(const U16* inchars, char* outchars, S32* nchars8p)
-{
- // Get 32 bit char32
- llwchar char32;
- S32 nchars16 = utf16chars_to_wchar(inchars, &char32);
- // Convert to utf8
- S32 nchars8 = wchar_to_utf8chars(char32, outchars);
- if (nchars8p)
- {
- *nchars8p = nchars8;
- }
- return nchars16;
-}
-
llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len)
{
llutf16string out;
@@ -216,7 +208,7 @@ llutf16string wstring_to_utf16str(const LLWString &utf32str)
return wstring_to_utf16str(utf32str, len);
}
-llutf16string utf8str_to_utf16str ( const LLString& utf8str )
+llutf16string utf8str_to_utf16str ( const std::string& utf8str )
{
LLWString wstr = utf8str_to_wstring ( utf8str );
return wstring_to_utf16str ( wstr );
@@ -492,210 +484,10 @@ std::string utf16str_to_utf8str(const llutf16string& utf16str, S32 len)
return wstring_to_utf8str(utf16str_to_wstring(utf16str, len), len);
}
-
-//LLWString wstring_truncate(const LLWString &wstr, const S32 max_len)
-//{
-// return wstr.substr(0, llmin((S32)wstr.length(), max_len));
-//}
-//
-//
-//LLWString wstring_trim(const LLWString &wstr)
-//{
-// LLWString outstr;
-// outstr = wstring_trimhead(wstr);
-// outstr = wstring_trimtail(outstr);
-// return outstr;
-//}
-//
-//
-//LLWString wstring_trimhead(const LLWString &wstr)
-//{
-// if(wstr.empty())
-// {
-// return wstr;
-// }
-//
-// S32 i = 0;
-// while((i < (S32)wstr.length()) && iswspace(wstr[i]))
-// {
-// i++;
-// }
-// return wstr.substr(i, wstr.length() - i);
-//}
-//
-//
-//LLWString wstring_trimtail(const LLWString &wstr)
-//{
-// if(wstr.empty())
-// {
-// return wstr;
-// }
-//
-// S32 len = (S32)wstr.length();
-//
-// S32 i = len - 1;
-// while (i >= 0 && iswspace(wstr[i]))
-// {
-// i--;
-// }
-//
-// if (i >= 0)
-// {
-// return wstr.substr(0, i + 1);
-// }
-// return wstr;
-//}
-//
-//
-//LLWString wstring_copyinto(const LLWString &dest, const LLWString &src, const S32 insert_offset)
-//{
-// llassert( insert_offset <= (S32)dest.length() );
-//
-// LLWString out_str = dest.substr(0, insert_offset);
-// out_str += src;
-// LLWString tail = dest.substr(insert_offset);
-// out_str += tail;
-//
-// return out_str;
-//}
-
-
-//LLWString wstring_detabify(const LLWString &wstr, const S32 num_spaces)
-//{
-// LLWString out_str;
-// // Replace tabs with spaces
-// for (S32 i = 0; i < (S32)wstr.length(); i++)
-// {
-// if (wstr[i] == '\t')
-// {
-// for (S32 j = 0; j < num_spaces; j++)
-// out_str += ' ';
-// }
-// else
-// {
-// out_str += wstr[i];
-// }
-// }
-// return out_str;
-//}
-
-
-//LLWString wstring_makeASCII(const LLWString &wstr)
-//{
-// // Replace non-ASCII chars with replace_char
-// LLWString out_str = wstr;
-// for (S32 i = 0; i < (S32)out_str.length(); i++)
-// {
-// if (out_str[i] > 0x7f)
-// {
-// out_str[i] = LL_UNKNOWN_CHAR;
-// }
-// }
-// return out_str;
-//}
-
-
-//LLWString wstring_substChar(const LLWString &wstr, const llwchar target_char, const llwchar replace_char)
-//{
-// // Replace all occurences of target_char with replace_char
-// LLWString out_str = wstr;
-// for (S32 i = 0; i < (S32)out_str.length(); i++)
-// {
-// if (out_str[i] == target_char)
-// {
-// out_str[i] = replace_char;
-// }
-// }
-// return out_str;
-//}
-//
-//
-//LLWString wstring_tolower(const LLWString &wstr)
-//{
-// LLWString out_str = wstr;
-// for (S32 i = 0; i < (S32)out_str.length(); i++)
-// {
-// out_str[i] = towlower(out_str[i]);
-// }
-// return out_str;
-//}
-//
-//
-//LLWString wstring_convert_to_lf(const LLWString &wstr)
-//{
-// const llwchar CR = 13;
-// // Remove carriage returns from string with CRLF
-// LLWString out_str;
-//
-// for (S32 i = 0; i < (S32)wstr.length(); i++)
-// {
-// if (wstr[i] != CR)
-// {
-// out_str += wstr[i];
-// }
-// }
-// return out_str;
-//}
-//
-//
-//LLWString wstring_convert_to_crlf(const LLWString &wstr)
-//{
-// const llwchar LF = 10;
-// const llwchar CR = 13;
-// // Remove carriage returns from string with CRLF
-// LLWString out_str;
-//
-// for (S32 i = 0; i < (S32)wstr.length(); i++)
-// {
-// if (wstr[i] == LF)
-// {
-// out_str += CR;
-// }
-// out_str += wstr[i];
-// }
-// return out_str;
-//}
-
-
-//S32 wstring_compare_insensitive(const LLWString &lhs, const LLWString &rhs)
-//{
-//
-// if (lhs == rhs)
-// {
-// return 0;
-// }
-//
-// if (lhs.empty())
-// {
-// return rhs.empty() ? 0 : 1;
-// }
-//
-// if (rhs.empty())
-// {
-// return -1;
-// }
-//
-//#ifdef LL_LINUX
-// // doesn't work because gcc 2.95 doesn't correctly implement c_str(). Sigh...
-// llerrs << "wstring_compare_insensitive doesn't work on Linux!" << llendl;
-// return 0;
-//#else
-// LLWString lhs_lower = lhs;
-// LLWString::toLower(lhs_lower);
-// std::string lhs_lower = wstring_to_utf8str(lhs_lower);
-// LLWString rhs_lower = lhs;
-// LLWString::toLower(rhs_lower);
-// std::string rhs_lower = wstring_to_utf8str(rhs_lower);
-//
-// return strcmp(lhs_lower.c_str(), rhs_lower.c_str());
-//#endif
-//}
-
-
std::string utf8str_trim(const std::string& utf8str)
{
LLWString wstr = utf8str_to_wstring(utf8str);
- LLWString::trim(wstr);
+ LLWStringUtil::trim(wstr);
return wstring_to_utf8str(wstr);
}
@@ -703,7 +495,7 @@ std::string utf8str_trim(const std::string& utf8str)
std::string utf8str_tolower(const std::string& utf8str)
{
LLWString out_str = utf8str_to_wstring(utf8str);
- LLWString::toLower(out_str);
+ LLWStringUtil::toLower(out_str);
return wstring_to_utf8str(out_str);
}
@@ -712,7 +504,7 @@ S32 utf8str_compare_insensitive(const std::string& lhs, const std::string& rhs)
{
LLWString wlhs = utf8str_to_wstring(lhs);
LLWString wrhs = utf8str_to_wstring(rhs);
- return LLWString::compareInsensitive(wlhs.c_str(), wrhs.c_str());
+ return LLWStringUtil::compareInsensitive(wlhs, wrhs);
}
std::string utf8str_truncate(const std::string& utf8str, const S32 max_len)
@@ -756,7 +548,7 @@ std::string utf8str_substChar(
const llwchar replace_char)
{
LLWString wstr = utf8str_to_wstring(utf8str);
- LLWString::replaceChar(wstr, target_char, replace_char);
+ LLWStringUtil::replaceChar(wstr, target_char, replace_char);
//wstr = wstring_substChar(wstr, target_char, replace_char);
return wstring_to_utf8str(wstr);
}
@@ -764,7 +556,7 @@ std::string utf8str_substChar(
std::string utf8str_makeASCII(const std::string& utf8str)
{
LLWString wstr = utf8str_to_wstring(utf8str);
- LLWString::_makeASCII(wstr);
+ LLWStringUtil::_makeASCII(wstr);
return wstring_to_utf8str(wstr);
}
@@ -964,19 +756,19 @@ namespace LLStringFn
#ifdef _DEBUG
template<class T>
-void LLStringBase<T>::testHarness()
+void LLStringUtilBase<T>::testHarness()
{
- LLString s1;
+ std::string s1;
llassert( s1.c_str() == NULL );
llassert( s1.size() == 0 );
llassert( s1.empty() );
- LLString s2( "hello");
+ std::string s2( "hello");
llassert( !strcmp( s2.c_str(), "hello" ) );
llassert( s2.size() == 5 );
llassert( !s2.empty() );
- LLString s3( s2 );
+ std::string s3( s2 );
llassert( "hello" == s2 );
llassert( s2 == "hello" );
@@ -985,12 +777,12 @@ void LLStringBase<T>::testHarness()
llassert( "gello" != s2 );
llassert( s2 != "gello" );
- LLString s4 = s2;
+ std::string s4 = s2;
llassert( !s4.empty() );
s4.empty();
llassert( s4.empty() );
- LLString s5("");
+ std::string s5("");
llassert( s5.empty() );
llassert( isValidIndex(s5, 0) );
@@ -1004,8 +796,8 @@ void LLStringBase<T>::testHarness()
llassert( s4 == "hello again!hello again!" );
- LLString s6 = s2 + " " + s2;
- LLString s7 = s6;
+ std::string s6 = s2 + " " + s2;
+ std::string s7 = s6;
llassert( s6 == s7 );
llassert( !( s6 != s7) );
llassert( !(s6 < s7) );
@@ -1028,10 +820,10 @@ void LLStringBase<T>::testHarness()
s2.insert( 1, "awn, don't yel");
llassert( s2 == "yawn, don't yell");
- LLString s8 = s2.substr( 6, 5 );
+ std::string s8 = s2.substr( 6, 5 );
llassert( s8 == "don't" );
- LLString s9 = " \t\ntest \t\t\n ";
+ std::string s9 = " \t\ntest \t\t\n ";
trim(s9);
llassert( s9 == "test" );
@@ -1046,17 +838,17 @@ void LLStringBase<T>::testHarness()
llassert( s9 == "abc123&*(abc" );
- LLString s10( 10, 'x' );
+ std::string s10( 10, 'x' );
llassert( s10 == "xxxxxxxxxx" );
- LLString s11( "monkey in the middle", 7, 2 );
+ std::string s11( "monkey in the middle", 7, 2 );
llassert( s11 == "in" );
- LLString s12; //empty
+ std::string s12; //empty
s12 += "foo";
llassert( s12 == "foo" );
- LLString s13; //empty
+ std::string s13; //empty
s13 += 'f';
llassert( s13 == "f" );
}
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 18cfe4b64c..50681b7967 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1,6 +1,6 @@
/**
* @file llstring.h
- * @brief String utility functions and LLString class.
+ * @brief String utility functions and std::string class.
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -155,50 +155,19 @@ public:
static BOOL isDigit(llwchar a) { return iswdigit(a) != 0; }
};
-//RN: I used a templated base class instead of a pure interface class to minimize code duplication
-// but it might be worthwhile to just go with two implementations (LLString and LLWString) of
-// an interface class, unless we can think of a good reason to have a std::basic_string polymorphic base
-
-// ****************************************************************
-// NOTA BENE: do *NOT* dynamically allocate memory inside of LLStringBase as the {*()^#%*)#%W^*)#%*)STL implentation
-// of basic_string doesn't provide a virtual destructor. If we need to allocate resources specific to LLString
-// then we should either customize std::basic_string to linden::basic_string or change LLString to be a wrapper
-// that contains an instance of std::basic_string. Similarly, overriding methods defined in std::basic_string will *not*
-// be called in a polymorphic manner (passing an instance of basic_string to a particular function)
-// ****************************************************************
-
template <class T>
-class LLStringBase : public std::basic_string<T>
+class LLStringUtilBase
{
public:
typedef typename std::basic_string<T>::size_type size_type;
- // naming convention follows those set for LLUUID
-// static LLStringBase null; // deprecated for std::string compliance
-// static LLStringBase zero_length; // deprecated for std::string compliance
-
-
- // standard constructors
- LLStringBase() : std::basic_string<T>() {}
- LLStringBase(const LLStringBase& s): std::basic_string<T>(s) {}
- LLStringBase(const std::basic_string<T>& s) : std::basic_string<T>(s) {}
- LLStringBase(const std::basic_string<T>& s, size_type pos, size_type n = std::basic_string<T>::npos)
- : std::basic_string<T>(s, pos, n) {}
- LLStringBase(size_type count, const T& c) : std::basic_string<T>() { assign(count, c);}
- // custom constructors
- LLStringBase(const T* s);
- LLStringBase(const T* s, size_type n);
- LLStringBase(const T* s, size_type pos, size_type n );
-
- bool operator==(const T* _Right) const { return _Right ? (std::basic_string<T>::compare(_Right) == 0) : this->empty(); }
-
public:
/////////////////////////////////////////////////////////////////////////////////////////
// Static Utility functions that operate on std::strings
- static LLStringBase null;
+ static std::basic_string<T> null;
- typedef std::map<std::string, std::string> format_map_t;
+ typedef std::map<std::basic_string<T>, std::basic_string<T> > format_map_t;
static S32 format(std::basic_string<T>& s, const format_map_t& fmt_map);
static BOOL isValidIndex(const std::basic_string<T>& string, size_type i)
@@ -230,8 +199,8 @@ public:
/**
* @brief Unsafe way to make ascii characters. You should probably
* only call this when interacting with the host operating system.
- * The 1 byte LLString does not work correctly.
- * The 2 and 4 byte LLString probably work, so LLWString::_makeASCII
+ * The 1 byte std::string does not work correctly.
+ * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
* should work.
*/
static void _makeASCII(std::basic_string<T>& string);
@@ -253,11 +222,13 @@ public:
// Like strcmp but also handles empty strings. Uses
// current locale.
static S32 compareStrings(const T* lhs, const T* rhs);
+ static S32 compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
// case insensitive version of above. Uses current locale on
// Win32, and falls back to a non-locale aware comparison on
// Linux.
static S32 compareInsensitive(const T* lhs, const T* rhs);
+ static S32 compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
// Case sensitive comparison with good handling of numbers. Does not use current locale.
// a.k.a. strdictcmp()
@@ -284,21 +255,21 @@ public:
};
-template<class T> LLStringBase<T> LLStringBase<T>::null;
+template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
-typedef LLStringBase<char> LLString;
-typedef LLStringBase<llwchar> LLWString;
+typedef LLStringUtilBase<char> LLStringUtil;
+typedef LLStringUtilBase<llwchar> LLWStringUtil;
+typedef std::basic_string<llwchar> LLWString;
//@ Use this where we want to disallow input in the form of "foo"
// This is used to catch places where english text is embedded in the code
// instead of in a translatable XUI file.
-class LLStringExplicit : public LLString
+class LLStringExplicit : public std::string
{
public:
- explicit LLStringExplicit(const char* s) : LLString(s) {}
- LLStringExplicit(const LLString& s) : LLString(s) {}
- LLStringExplicit(const std::string& s) : LLString(s) {}
- LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : LLString(s, pos, n) {}
+ explicit LLStringExplicit(const char* s) : std::string(s) {}
+ LLStringExplicit(const std::string& s) : std::string(s) {}
+ LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
};
struct LLDictionaryLess
@@ -306,7 +277,7 @@ struct LLDictionaryLess
public:
bool operator()(const std::string& a, const std::string& b)
{
- return (LLString::precedesDict(a, b) ? true : false);
+ return (LLStringUtil::precedesDict(a, b) ? true : false);
}
};
@@ -335,6 +306,7 @@ inline std::string chop_tail_copy(
* pointer is NULL.
*/
std::string ll_safe_string(const char* in);
+std::string ll_safe_string(const char* in, S32 maxlen);
/**
* @brief This translates a nybble stored as a hex value from 0-f back
@@ -351,7 +323,7 @@ U8 hex_as_nybble(char hex);
* @param filename The full name of the file to read.
* @return Returns true on success. If false, str is unmodified.
*/
-bool _read_file_into_string(std::string& str, const char* filename);
+bool _read_file_into_string(std::string& str, const std::string& filename);
/**
* Unicode support
@@ -373,20 +345,17 @@ LLWString utf16str_to_wstring(const llutf16string &utf16str);
llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
llutf16string wstring_to_utf16str(const LLWString &utf32str);
-llutf16string utf8str_to_utf16str ( const LLString& utf8str, S32 len);
-llutf16string utf8str_to_utf16str ( const LLString& utf8str );
+llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
+llutf16string utf8str_to_utf16str ( const std::string& utf8str );
LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
LLWString utf8str_to_wstring(const std::string &utf8str);
// Same function, better name. JC
inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
-// Special hack for llfilepicker.cpp:
-S32 utf16chars_to_utf8chars(const U16* inchars, char* outchars, S32* nchars8 = 0);
-S32 utf16chars_to_wchar(const U16* inchars, llwchar* outchar);
+//
S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
-//
std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
std::string wstring_to_utf8str(const LLWString &utf32str);
@@ -448,15 +417,6 @@ std::string mbcsstring_makeASCII(const std::string& str);
std::string utf8str_removeCRLF(const std::string& utf8str);
-template <class T>
-std::ostream& operator<<(std::ostream &s, const LLStringBase<T> &str)
-{
- s << ((std::basic_string<T>)str);
- return s;
-}
-
-std::ostream& operator<<(std::ostream &s, const LLWString &wstr);
-
#if LL_WINDOWS
/* @name Windows string helpers
*/
@@ -492,7 +452,7 @@ std::string ll_convert_wide_to_string(const wchar_t* in);
#endif // LL_WINDOWS
/**
- * Many of the 'strip' and 'replace' methods of LLStringBase need
+ * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
* specialization to work with the signed char type.
* Sadly, it is not possible (AFAIK) to specialize a single method of
* a template class.
@@ -558,11 +518,12 @@ namespace LLStringFn
// static
template<class T>
-S32 LLStringBase<T>::format(std::basic_string<T>& s, const format_map_t& fmt_map)
+S32 LLStringUtilBase<T>::format(std::basic_string<T>& s, const format_map_t& fmt_map)
{
typedef typename std::basic_string<T>::size_type string_size_type_t;
+ typedef typename format_map_t::const_iterator format_map_const_iterator_t;
S32 res = 0;
- for (format_map_t::const_iterator iter = fmt_map.begin(); iter != fmt_map.end(); ++iter)
+ for (format_map_const_iterator_t iter = fmt_map.begin(); iter != fmt_map.end(); ++iter)
{
U32 fmtlen = iter->first.size();
string_size_type_t n = 0;
@@ -584,7 +545,7 @@ S32 LLStringBase<T>::format(std::basic_string<T>& s, const format_map_t& fmt_map
// static
template<class T>
-S32 LLStringBase<T>::compareStrings(const T* lhs, const T* rhs)
+S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
{
S32 result;
if( lhs == rhs )
@@ -608,9 +569,16 @@ S32 LLStringBase<T>::compareStrings(const T* lhs, const T* rhs)
return result;
}
+//static
+template<class T>
+S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+ return LLStringOps::collate(lhs.c_str(), rhs.c_str());
+}
+
// static
template<class T>
-S32 LLStringBase<T>::compareInsensitive(const T* lhs, const T* rhs )
+S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
{
S32 result;
if( lhs == rhs )
@@ -629,22 +597,32 @@ S32 LLStringBase<T>::compareInsensitive(const T* lhs, const T* rhs )
}
else
{
- LLStringBase<T> lhs_string(lhs);
- LLStringBase<T> rhs_string(rhs);
- LLStringBase<T>::toUpper(lhs_string);
- LLStringBase<T>::toUpper(rhs_string);
+ std::basic_string<T> lhs_string(lhs);
+ std::basic_string<T> rhs_string(rhs);
+ LLStringUtilBase<T>::toUpper(lhs_string);
+ LLStringUtilBase<T>::toUpper(rhs_string);
result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
}
return result;
}
+//static
+template<class T>
+S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+ std::basic_string<T> lhs_string(lhs);
+ std::basic_string<T> rhs_string(rhs);
+ LLStringUtilBase<T>::toUpper(lhs_string);
+ LLStringUtilBase<T>::toUpper(rhs_string);
+ return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+}
// Case sensitive comparison with good handling of numbers. Does not use current locale.
// a.k.a. strdictcmp()
//static
template<class T>
-S32 LLStringBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
{
const T* a = astr.c_str();
const T* b = bstr.c_str();
@@ -683,8 +661,9 @@ S32 LLStringBase<T>::compareDict(const std::basic_string<T>& astr, const std::ba
return ca-cb;
}
+// static
template<class T>
-S32 LLStringBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
{
const T* a = astr.c_str();
const T* b = bstr.c_str();
@@ -719,11 +698,11 @@ S32 LLStringBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, co
// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
// static
template<class T>
-BOOL LLStringBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
+BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
{
if( a.size() && b.size() )
{
- return (LLStringBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
+ return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
}
else
{
@@ -731,28 +710,9 @@ BOOL LLStringBase<T>::precedesDict( const std::basic_string<T>& a, const std::ba
}
}
-// Constructors
-template<class T>
-LLStringBase<T>::LLStringBase(const T* s ) : std::basic_string<T>()
-{
- if (s) assign(s);
-}
-
-template<class T>
-LLStringBase<T>::LLStringBase(const T* s, size_type n ) : std::basic_string<T>()
-{
- if (s) assign(s, n);
-}
-
-// Init from a substring
-template<class T>
-LLStringBase<T>::LLStringBase(const T* s, size_type pos, size_type n )
-: std::basic_string<T>( (s ? s : std::basic_string<T>() ), pos, n )
-{ }
-
//static
template<class T>
-void LLStringBase<T>::toUpper(std::basic_string<T>& string)
+void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)
{
if( !string.empty() )
{
@@ -766,7 +726,7 @@ void LLStringBase<T>::toUpper(std::basic_string<T>& string)
//static
template<class T>
-void LLStringBase<T>::toLower(std::basic_string<T>& string)
+void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
{
if( !string.empty() )
{
@@ -780,7 +740,7 @@ void LLStringBase<T>::toLower(std::basic_string<T>& string)
//static
template<class T>
-void LLStringBase<T>::trimHead(std::basic_string<T>& string)
+void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
{
if( !string.empty() )
{
@@ -795,7 +755,7 @@ void LLStringBase<T>::trimHead(std::basic_string<T>& string)
//static
template<class T>
-void LLStringBase<T>::trimTail(std::basic_string<T>& string)
+void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
{
if( string.size() )
{
@@ -814,7 +774,7 @@ void LLStringBase<T>::trimTail(std::basic_string<T>& string)
// Replace line feeds with carriage return-line feed pairs.
//static
template<class T>
-void LLStringBase<T>::addCRLF(std::basic_string<T>& string)
+void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
{
const T LF = 10;
const T CR = 13;
@@ -855,7 +815,7 @@ void LLStringBase<T>::addCRLF(std::basic_string<T>& string)
// Remove all carriage returns
//static
template<class T>
-void LLStringBase<T>::removeCRLF(std::basic_string<T>& string)
+void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
{
const T CR = 13;
@@ -876,7 +836,7 @@ void LLStringBase<T>::removeCRLF(std::basic_string<T>& string)
//static
template<class T>
-void LLStringBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
+void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
{
size_type found_pos = 0;
for (found_pos = string.find(target, found_pos);
@@ -889,7 +849,7 @@ void LLStringBase<T>::replaceChar( std::basic_string<T>& string, T target, T rep
//static
template<class T>
-void LLStringBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
+void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
{
const char LF = 10;
const S8 MIN = 32;
@@ -909,12 +869,12 @@ void LLStringBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T r
//static
template<class T>
-void LLStringBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
+void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
{
const T TAB = '\t';
const T SPACE = ' ';
- LLStringBase<T> out_str;
+ std::basic_string<T> out_str;
// Replace tabs with spaces
for (size_type i = 0; i < str.length(); i++)
{
@@ -933,7 +893,7 @@ void LLStringBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_typ
//static
template<class T>
-BOOL LLStringBase<T>::containsNonprintable(const std::basic_string<T>& string)
+BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
{
const char MIN = 32;
BOOL rv = FALSE;
@@ -950,7 +910,7 @@ BOOL LLStringBase<T>::containsNonprintable(const std::basic_string<T>& string)
//static
template<class T>
-void LLStringBase<T>::stripNonprintable(std::basic_string<T>& string)
+void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
{
const char MIN = 32;
size_type j = 0;
@@ -981,7 +941,7 @@ void LLStringBase<T>::stripNonprintable(std::basic_string<T>& string)
}
template<class T>
-void LLStringBase<T>::_makeASCII(std::basic_string<T>& string)
+void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
{
// Replace non-ASCII chars with LL_UNKNOWN_CHAR
for (size_type i = 0; i < string.length(); i++)
@@ -995,7 +955,7 @@ void LLStringBase<T>::_makeASCII(std::basic_string<T>& string)
// static
template<class T>
-void LLStringBase<T>::copy( T* dst, const T* src, size_type dst_size )
+void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
{
if( dst_size > 0 )
{
@@ -1011,7 +971,7 @@ void LLStringBase<T>::copy( T* dst, const T* src, size_type dst_size )
// static
template<class T>
-void LLStringBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
+void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
{
if ( offset == dst.length() )
{
@@ -1032,7 +992,7 @@ void LLStringBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_strin
// True if this is the head of s.
//static
template<class T>
-BOOL LLStringBase<T>::isHead( const std::basic_string<T>& string, const T* s )
+BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s )
{
if( string.empty() )
{
@@ -1046,14 +1006,14 @@ BOOL LLStringBase<T>::isHead( const std::basic_string<T>& string, const T* s )
}
template<class T>
-BOOL LLStringBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
+BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
{
if( string.empty() )
{
return FALSE;
}
- LLStringBase<T> temp( string );
+ std::basic_string<T> temp( string );
trim(temp);
if(
(temp == "1") ||
@@ -1083,7 +1043,7 @@ BOOL LLStringBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& va
}
template<class T>
-BOOL LLStringBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
+BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1096,7 +1056,7 @@ BOOL LLStringBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
}
template<class T>
-BOOL LLStringBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
+BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1109,7 +1069,7 @@ BOOL LLStringBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
}
template<class T>
-BOOL LLStringBase<T>::convertToS16(const std::basic_string<T>& string, S16& value)
+BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1122,7 +1082,7 @@ BOOL LLStringBase<T>::convertToS16(const std::basic_string<T>& string, S16& valu
}
template<class T>
-BOOL LLStringBase<T>::convertToU16(const std::basic_string<T>& string, U16& value)
+BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1135,14 +1095,14 @@ BOOL LLStringBase<T>::convertToU16(const std::basic_string<T>& string, U16& valu
}
template<class T>
-BOOL LLStringBase<T>::convertToU32(const std::basic_string<T>& string, U32& value)
+BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value)
{
if( string.empty() )
{
return FALSE;
}
- LLStringBase<T> temp( string );
+ std::basic_string<T> temp( string );
trim(temp);
U32 v;
std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
@@ -1162,14 +1122,14 @@ BOOL LLStringBase<T>::convertToU32(const std::basic_string<T>& string, U32& valu
}
template<class T>
-BOOL LLStringBase<T>::convertToS32(const std::basic_string<T>& string, S32& value)
+BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value)
{
if( string.empty() )
{
return FALSE;
}
- LLStringBase<T> temp( string );
+ std::basic_string<T> temp( string );
trim(temp);
S32 v;
std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
@@ -1189,7 +1149,7 @@ BOOL LLStringBase<T>::convertToS32(const std::basic_string<T>& string, S32& valu
}
template<class T>
-BOOL LLStringBase<T>::convertToF32(const std::basic_string<T>& string, F32& value)
+BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value)
{
F64 value64 = 0.0;
BOOL success = convertToF64(string, value64);
@@ -1202,14 +1162,14 @@ BOOL LLStringBase<T>::convertToF32(const std::basic_string<T>& string, F32& valu
}
template<class T>
-BOOL LLStringBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
+BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
{
if( string.empty() )
{
return FALSE;
}
- LLStringBase<T> temp( string );
+ std::basic_string<T> temp( string );
trim(temp);
F64 v;
std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
@@ -1229,7 +1189,7 @@ BOOL LLStringBase<T>::convertToF64(const std::basic_string<T>& string, F64& valu
}
template<class T>
-void LLStringBase<T>::truncate(std::basic_string<T>& string, size_type count)
+void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
{
size_type cur_size = string.size();
string.resize(count < cur_size ? count : cur_size);
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 8700d9681e..d78a8591cb 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -143,28 +143,22 @@ LLOSInfo::LLOSInfo() :
std::string csdversion = utf16str_to_utf8str(osvi.szCSDVersion);
// Display version, service pack (if any), and build number.
- char tmp[MAX_STRING]; /* Flawfinder: ignore */
+ std::string tmpstr;
if(osvi.dwMajorVersion <= 4)
{
- snprintf( /* Flawfinder: ignore */
- tmp,
- sizeof(tmp),
- "version %d.%d %s (Build %d)",
- osvi.dwMajorVersion,
- osvi.dwMinorVersion,
- csdversion.c_str(),
- (osvi.dwBuildNumber & 0xffff));
+ tmpstr = llformat("version %d.%d %s (Build %d)",
+ osvi.dwMajorVersion,
+ osvi.dwMinorVersion,
+ csdversion.c_str(),
+ (osvi.dwBuildNumber & 0xffff));
}
else
{
- snprintf( /* Flawfinder: ignore */
- tmp,
- sizeof(tmp),
- "%s (Build %d)",
- csdversion.c_str(),
- (osvi.dwBuildNumber & 0xffff));
+ tmpstr = llformat("%s (Build %d)",
+ csdversion.c_str(),
+ (osvi.dwBuildNumber & 0xffff));
}
- mOSString = mOSStringSimple + tmp;
+ mOSString = mOSStringSimple + tmpstr;
}
break;
@@ -397,7 +391,7 @@ LLCPUInfo::LLCPUInfo()
mCPUString = out.str();
#elif LL_LINUX
- std::map< LLString, LLString > cpuinfo;
+ std::map< std::string, std::string > cpuinfo;
LLFILE* cpuinfo_fp = LLFile::fopen(CPUINFO_FILE, "rb");
if(cpuinfo_fp)
{
@@ -420,21 +414,21 @@ LLCPUInfo::LLCPUInfo()
if (nlspot == NULL)
nlspot = line + strlen( line ); // Fallback to terminating NUL
std::string linename( line, tabspot );
- LLString llinename(linename);
- LLString::toLower(llinename);
+ std::string llinename(linename);
+ LLStringUtil::toLower(llinename);
std::string lineval( spacespot + 1, nlspot );
cpuinfo[ llinename ] = lineval;
}
fclose(cpuinfo_fp);
}
# if LL_X86
- LLString flags = " " + cpuinfo["flags"] + " ";
- LLString::toLower(flags);
+ std::string flags = " " + cpuinfo["flags"] + " ";
+ LLStringUtil::toLower(flags);
mHasSSE = ( flags.find( " sse " ) != std::string::npos );
mHasSSE2 = ( flags.find( " sse2 " ) != std::string::npos );
F64 mhz;
- if (LLString::convertToF64(cpuinfo["cpu mhz"], mhz)
+ if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
&& 200.0 < mhz && mhz < 10000.0)
{
mCPUMhz = (S32)llrint(mhz);
@@ -658,18 +652,17 @@ std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info)
return s;
}
-BOOL gunzip_file(const char *srcfile, const char *dstfile)
+BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
{
- char tmpfile[LL_MAX_PATH]; /* Flawfinder: ignore */
+ std::string tmpfile;
const S32 UNCOMPRESS_BUFFER_SIZE = 32768;
BOOL retval = FALSE;
gzFile src = NULL;
U8 buffer[UNCOMPRESS_BUFFER_SIZE];
LLFILE *dst = NULL;
S32 bytes = 0;
- (void *) strcpy(tmpfile, dstfile); /* Flawfinder: ignore */
- (void *) strncat(tmpfile, ".t", sizeof(tmpfile) - strlen(tmpfile) -1); /* Flawfinder: ignore */
- src = gzopen(srcfile, "rb");
+ tmpfile = dstfile + ".t";
+ src = gzopen(srcfile.c_str(), "rb");
if (! src) goto err;
dst = LLFile::fopen(tmpfile, "wb"); /* Flawfinder: ignore */
if (! dst) goto err;
@@ -693,18 +686,17 @@ err:
return retval;
}
-BOOL gzip_file(const char *srcfile, const char *dstfile)
+BOOL gzip_file(const std::string& srcfile, const std::string& dstfile)
{
const S32 COMPRESS_BUFFER_SIZE = 32768;
- char tmpfile[LL_MAX_PATH]; /* Flawfinder: ignore */
+ std::string tmpfile;
BOOL retval = FALSE;
U8 buffer[COMPRESS_BUFFER_SIZE];
gzFile dst = NULL;
LLFILE *src = NULL;
S32 bytes = 0;
- (void *) strcpy(tmpfile, dstfile); /* Flawfinder: ignore */
- (void *) strncat(tmpfile, ".t", sizeof(tmpfile) - strlen(tmpfile) -1); /* Flawfinder: ignore */
- dst = gzopen(tmpfile, "wb"); /* Flawfinder: ignore */
+ tmpfile = dstfile + ".t";
+ dst = gzopen(tmpfile.c_str(), "wb"); /* Flawfinder: ignore */
if (! dst) goto err;
src = LLFile::fopen(srcfile, "rb"); /* Flawfinder: ignore */
if (! src) goto err;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 332d62c186..a56ba2bdda 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -127,9 +127,9 @@ std::ostream& operator<<(std::ostream& s, const LLCPUInfo& info);
std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info);
// gunzip srcfile into dstfile. Returns FALSE on error.
-BOOL gunzip_file(const char *srcfile, const char *dstfile);
+BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile);
// gzip srcfile into dstfile. Returns FALSE on error.
-BOOL gzip_file(const char *srcfile, const char *dstfile);
+BOOL gzip_file(const std::string& srcfile, const std::string& dstfile);
extern LLCPUInfo gSysCPU;
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 3d05699cd6..77d683adc0 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -483,7 +483,7 @@ struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_daylight_time)
}
-void microsecondsToTimecodeString(U64 current_time, char *tcstring)
+void microsecondsToTimecodeString(U64 current_time, std::string& tcstring)
{
U64 hours;
U64 minutes;
@@ -501,11 +501,11 @@ void microsecondsToTimecodeString(U64 current_time, char *tcstring)
subframes = current_time / (U64)42;
subframes %= 100;
- sprintf(tcstring,"%3.3d:%2.2d:%2.2d:%2.2d.%2.2d",(int)hours,(int)minutes,(int)seconds,(int)frames,(int)subframes); /* Flawfinder: ignore */
+ tcstring = llformat("%3.3d:%2.2d:%2.2d:%2.2d.%2.2d",(int)hours,(int)minutes,(int)seconds,(int)frames,(int)subframes);
}
-void secondsToTimecodeString(F32 current_time, char *tcstring)
+void secondsToTimecodeString(F32 current_time, std::string& tcstring)
{
microsecondsToTimecodeString((U64)((F64)(SEC_TO_MICROSEC*current_time)), tcstring);
}
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index 41562f4a51..d3a83339f0 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -162,8 +162,8 @@ BOOL is_daylight_savings();
// struct tm* internal_time = utc_to_pacific_time(utc_time, gDaylight);
struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_daylight_time);
-void microsecondsToTimecodeString(U64 current_time, char *tcstring);
-void secondsToTimecodeString(F32 current_time, char *tcstring);
+void microsecondsToTimecodeString(U64 current_time, std::string& tcstring);
+void secondsToTimecodeString(F32 current_time, std::string& tcstring);
// class for scheduling a function to be called at a given frequency (approximate, inprecise)
class LLEventTimer
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 3f86681315..51e27e0708 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -149,9 +149,9 @@ U32 janky_fast_random_seeded_bytes(U32 seed, U32 val)
#endif
// Common to all UUID implementations
-void LLUUID::toString(char *out) const
+void LLUUID::toString(std::string& out) const
{
- sprintf(out,
+ out = llformat(
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
(U8)(mData[0]),
(U8)(mData[1]),
@@ -171,6 +171,23 @@ void LLUUID::toString(char *out) const
(U8)(mData[15]));
}
+// *TODO: deprecate
+void LLUUID::toString(char *out) const
+{
+ std::string buffer;
+ toString(buffer);
+ strcpy(out,buffer.c_str()); /* Flawfinder: ignore */
+}
+
+void LLUUID::toCompressedString(std::string& out) const
+{
+ char bytes[UUID_BYTES+1];
+ memcpy(bytes, mData, UUID_BYTES); /* Flawfinder: ignore */
+ bytes[UUID_BYTES] = '\0';
+ out = bytes;
+}
+
+// *TODO: deprecate
void LLUUID::toCompressedString(char *out) const
{
memcpy(out, mData, UUID_BYTES); /* Flawfinder: ignore */
@@ -184,38 +201,32 @@ std::string LLUUID::getString() const
std::string LLUUID::asString() const
{
- char str[UUID_STR_SIZE]; /* Flawfinder: ignore */
+ std::string str;
toString(str);
- return std::string(str);
+ return str;
}
-BOOL LLUUID::set(const std::string& in_string, BOOL emit)
+BOOL LLUUID::set(const char* in_string, BOOL emit)
{
- return set(in_string.c_str(), emit);
+ return set(ll_safe_string(in_string));
}
-BOOL LLUUID::set(const char *in_string, BOOL emit)
+BOOL LLUUID::set(const std::string& in_string, BOOL emit)
{
BOOL broken_format = FALSE;
- if (!in_string)
- {
- llerrs << "No string pointer in LLUUID::set!" << llendl;
- setNull();
- return FALSE;
- }
// empty strings should make NULL uuid
- if (!in_string[0])
+ if (in_string.empty())
{
setNull();
return TRUE;
}
- if (strlen(in_string) != (UUID_STR_LENGTH - 1)) /* Flawfinder: ignore */
+ if (in_string.length() != (UUID_STR_LENGTH - 1)) /* Flawfinder: ignore */
{
// I'm a moron. First implementation didn't have the right UUID format.
// Shouldn't see any of these any more
- if (strlen(in_string) == (UUID_STR_LENGTH - 2)) /* Flawfinder: ignore */
+ if (in_string.length() == (UUID_STR_LENGTH - 2)) /* Flawfinder: ignore */
{
if(emit)
{
@@ -251,17 +262,17 @@ BOOL LLUUID::set(const char *in_string, BOOL emit)
mData[i] = 0;
- if ((*(in_string + cur_pos) >= '0') && (*(in_string+cur_pos) <= '9'))
+ if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9'))
{
- mData[i] += (U8)(*(in_string + cur_pos) - '0');
+ mData[i] += (U8)(in_string[cur_pos] - '0');
}
- else if ((*(in_string + cur_pos) >= 'a') && (*(in_string+cur_pos) <='f'))
+ else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f'))
{
- mData[i] += (U8)(10 + *(in_string + cur_pos) - 'a');
+ mData[i] += (U8)(10 + in_string[cur_pos] - 'a');
}
- else if ((*(in_string + cur_pos) >= 'A') && (*(in_string+cur_pos) <='F'))
+ else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F'))
{
- mData[i] += (U8)(10 + *(in_string + cur_pos) - 'A');
+ mData[i] += (U8)(10 + in_string[cur_pos] - 'A');
}
else
{
@@ -276,17 +287,17 @@ BOOL LLUUID::set(const char *in_string, BOOL emit)
mData[i] = mData[i] << 4;
cur_pos++;
- if ((*(in_string + cur_pos) >= '0') && (*(in_string+cur_pos) <= '9'))
+ if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9'))
{
- mData[i] += (U8)(*(in_string + cur_pos) - '0');
+ mData[i] += (U8)(in_string[cur_pos] - '0');
}
- else if ((*(in_string + cur_pos) >= 'a') && (*(in_string+cur_pos) <='f'))
+ else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f'))
{
- mData[i] += (U8)(10 + *(in_string + cur_pos) - 'a');
+ mData[i] += (U8)(10 + in_string[cur_pos] - 'a');
}
- else if ((*(in_string + cur_pos) >= 'A') && (*(in_string+cur_pos) <='F'))
+ else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F'))
{
- mData[i] += (U8)(10 + *(in_string + cur_pos) - 'A');
+ mData[i] += (U8)(10 + in_string[cur_pos] - 'A');
}
else
{
@@ -305,20 +316,11 @@ BOOL LLUUID::set(const char *in_string, BOOL emit)
BOOL LLUUID::validate(const std::string& in_string)
{
- return validate(in_string.c_str());
-}
-
-BOOL LLUUID::validate(const char *in_string)
-{
BOOL broken_format = FALSE;
- if (!in_string)
- {
- return FALSE;
- }
- if (strlen(in_string) != (UUID_STR_LENGTH - 1)) /* Flawfinder: ignore */
+ if (in_string.length() != (UUID_STR_LENGTH - 1)) /* Flawfinder: ignore */
{
// I'm a moron. First implementation didn't have the right UUID format.
- if (strlen(in_string) == (UUID_STR_LENGTH - 2)) /* Flawfinder: ignore */
+ if (in_string.length() == (UUID_STR_LENGTH - 2)) /* Flawfinder: ignore */
{
broken_format = TRUE;
}
@@ -329,8 +331,7 @@ BOOL LLUUID::validate(const char *in_string)
}
U8 cur_pos = 0;
- U32 i;
- for (i = 0; i < 16; i++)
+ for (U32 i = 0; i < 16; i++)
{
if ((i == 4) || (i == 6) || (i == 8) || (i == 10))
{
@@ -342,13 +343,13 @@ BOOL LLUUID::validate(const char *in_string)
}
}
- if ((*(in_string + cur_pos) >= '0') && (*(in_string+cur_pos) <= '9'))
+ if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9'))
{
}
- else if ((*(in_string + cur_pos) >= 'a') && (*(in_string+cur_pos) <='f'))
+ else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f'))
{
}
- else if ((*(in_string + cur_pos) >= 'A') && (*(in_string+cur_pos) <='F'))
+ else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F'))
{
}
else
@@ -358,13 +359,13 @@ BOOL LLUUID::validate(const char *in_string)
cur_pos++;
- if ((*(in_string + cur_pos) >= '0') && (*(in_string+cur_pos) <= '9'))
+ if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9'))
{
}
- else if ((*(in_string + cur_pos) >= 'a') && (*(in_string+cur_pos) <='f'))
+ else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f'))
{
}
- else if ((*(in_string + cur_pos) >= 'A') && (*(in_string+cur_pos) <='F'))
+ else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F'))
{
}
else
@@ -412,8 +413,7 @@ LLUUID LLUUID::combine(const LLUUID &other) const
std::ostream& operator<<(std::ostream& s, const LLUUID &uuid)
{
- char uuid_str[UUID_STR_LENGTH];
-
+ std::string uuid_str;
uuid.toString(uuid_str);
s << uuid_str;
return s;
@@ -428,7 +428,7 @@ std::istream& operator>>(std::istream &s, LLUUID &uuid)
s >> uuid_str[i];
}
uuid_str[i] = '\0';
- uuid.set(uuid_str);
+ uuid.set(std::string(uuid_str));
return s;
}
@@ -891,15 +891,15 @@ U32 LLUUID::getRandomSeed()
return(*(U32 *)seed);
}
-BOOL LLUUID::parseUUID(const char* buf, LLUUID* value)
+BOOL LLUUID::parseUUID(const std::string& buf, LLUUID* value)
{
- if( buf == NULL || buf[0] == '\0' || value == NULL)
+ if( buf.empty() || value == NULL)
{
return FALSE;
}
- LLString temp( buf );
- LLString::trim(temp);
+ std::string temp( buf );
+ LLStringUtil::trim(temp);
if( LLUUID::validate( temp ) )
{
value->set( temp );
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index 2f82ec9a93..b2fcce5161 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -106,7 +106,9 @@ public:
friend std::istream& operator>>(std::istream& s, LLUUID &uuid);
void toString(char *out) const; // Does not allocate memory, needs 36 characters (including \0)
+ void toString(std::string& out) const;
void toCompressedString(char *out) const; // Does not allocate memory, needs 17 characters (including \0)
+ void toCompressedString(std::string& out) const;
std::string asString() const;
std::string getString() const;
@@ -115,14 +117,13 @@ public:
U32 getCRC32() const;
static BOOL validate(const std::string& in_string); // Validate that the UUID string is legal.
- static BOOL validate(const char *in_string); // Validate that the UUID string is legal.
static const LLUUID null;
static U32 getRandomSeed();
static S32 getNodeID(unsigned char * node_id);
- static BOOL parseUUID(const char* buf, LLUUID* value);
+ static BOOL parseUUID(const std::string& buf, LLUUID* value);
U8 mData[UUID_BYTES];
};
diff --git a/indra/llcommon/metapropertyt.h b/indra/llcommon/metapropertyt.h
index 488a60c22f..158d0cebec 100644
--- a/indra/llcommon/metapropertyt.h
+++ b/indra/llcommon/metapropertyt.h
@@ -86,13 +86,6 @@ inline const LLReflective* LLMetaPropertyT<std::string>::get(const LLReflective*
}
template <>
-inline const LLReflective* LLMetaPropertyT<LLString>::get(const LLReflective* object) const
-{
- checkObjectClass(object);
- return NULL;
-}
-
-template <>
inline const LLReflective* LLMetaPropertyT<LLUUID>::get(const LLReflective* object) const
{
checkObjectClass(object);
@@ -112,12 +105,6 @@ inline LLSD LLMetaPropertyT<std::string>::getLLSD(const LLReflective* object) co
}
template <>
-inline LLSD LLMetaPropertyT<LLString>::getLLSD(const LLReflective* object) const
-{
- return *(getProperty(object));
-}
-
-template <>
inline LLSD LLMetaPropertyT<LLUUID>::getLLSD(const LLReflective* object) const
{
return *(getProperty(object));
diff --git a/indra/llcommon/u64.cpp b/indra/llcommon/u64.cpp
index f3422770ae..b23c74b79e 100644
--- a/indra/llcommon/u64.cpp
+++ b/indra/llcommon/u64.cpp
@@ -34,10 +34,10 @@
#include "u64.h"
-U64 str_to_U64(const char *str)
+U64 str_to_U64(const std::string& str)
{
U64 result = 0;
- const char *aptr = strpbrk(str,"0123456789");
+ const char *aptr = strpbrk(str.c_str(),"0123456789");
if (!aptr)
{
@@ -54,8 +54,9 @@ U64 str_to_U64(const char *str)
}
-char* U64_to_str(U64 value, char* result, S32 result_size)
-{
+std::string U64_to_str(U64 value)
+{
+ std::string res;
U32 part1,part2,part3;
part3 = (U32)(value % (U64)10000000);
@@ -70,31 +71,26 @@ char* U64_to_str(U64 value, char* result, S32 result_size)
if (part1)
{
- snprintf( /* Flawfinder: ignore */
- result,
- result_size,
- "%u%07u%07u",
- part1,part2,part3);
+ res = llformat("%u%07u%07u",part1,part2,part3);
}
else if (part2)
{
- snprintf( /* Flawfinder: ignore */
- result,
- result_size,
- "%u%07u",
- part2,part3);
+ res = llformat("%u%07u",part2,part3);
}
else
{
- snprintf( /* Flawfinder: ignore */
- result,
- result_size,
- "%u",
- part3);
+ res = llformat("%u",part3);
}
- return (result);
+ return res;
}
+char* U64_to_str(U64 value, char* result, S32 result_size)
+{
+ std::string res = U64_to_str(value);
+ LLStringUtil::copy(result, res.c_str(), result_size);
+ return result;
+}
+
F64 U64_to_F64(const U64 value)
{
S64 top_bits = (S64)(value >> 1);
diff --git a/indra/llcommon/u64.h b/indra/llcommon/u64.h
index f4580513bc..3b833a4587 100644
--- a/indra/llcommon/u64.h
+++ b/indra/llcommon/u64.h
@@ -38,7 +38,14 @@
* @param str The string to parse.
* @return Returns the first U64 value found in the string or 0 on failure.
*/
-U64 str_to_U64(const char* str);
+U64 str_to_U64(const std::string& str);
+
+/**
+ * @brief Given a U64 value, return a printable representation.
+ * @param value The U64 to turn into a printable character array.
+ * @return Returns the result string.
+ */
+std::string U64_to_str(U64 value);
/**
* @brief Given a U64 value, return a printable representation.