forked from 0ad/0ad
Added the UniDoubler; this means that code can use CStr or CStr8 for 8-bit ascii strings, as well as CStr16 for wchar_t strings (magic! :-P)
This was SVN commit r477.
This commit is contained in:
parent
6593bc959b
commit
5276a527ae
@ -1,9 +1,19 @@
|
||||
#include "precompiled.h"
|
||||
|
||||
#include "CStr.h"
|
||||
#ifndef CStr_CPP_FIRST
|
||||
#define CStr_CPP_FIRST
|
||||
|
||||
#include "Network/Serialization.h"
|
||||
#include <cassert>
|
||||
|
||||
#define UNIDOUBLER_HEADER "CStr.cpp"
|
||||
#include "UniDoubler.h"
|
||||
|
||||
#else
|
||||
|
||||
#include "CStr.h"
|
||||
using namespace std;
|
||||
|
||||
CStr::CStr()
|
||||
{
|
||||
// Default Constructor
|
||||
@ -62,14 +72,14 @@ CStr::CStr(unsigned long Number)
|
||||
CStr::CStr(float Number)
|
||||
{
|
||||
// Creates CStr from a float
|
||||
_tsprintf(m_ConversionBuffer, FLOAT_CONVERSION, Number);
|
||||
_tsnprintf(m_ConversionBuffer, CONVERSION_BUFFER_SIZE, FLOAT_CONVERSION, Number);
|
||||
m_String = m_ConversionBuffer;
|
||||
}
|
||||
|
||||
CStr::CStr(double Number)
|
||||
{
|
||||
// Creates CStr from a double
|
||||
_tsprintf(m_ConversionBuffer, FLOAT_CONVERSION, Number);
|
||||
_tsnprintf(m_ConversionBuffer, CONVERSION_BUFFER_SIZE, FLOAT_CONVERSION, Number);
|
||||
m_String = m_ConversionBuffer;
|
||||
}
|
||||
|
||||
@ -328,14 +338,14 @@ CStr &CStr::operator=(unsigned long Number)
|
||||
|
||||
CStr &CStr::operator=(float Number)
|
||||
{
|
||||
_tsprintf(m_ConversionBuffer, FLOAT_CONVERSION, Number);
|
||||
_tsnprintf(m_ConversionBuffer, CONVERSION_BUFFER_SIZE, FLOAT_CONVERSION, Number);
|
||||
m_String = m_ConversionBuffer;
|
||||
return *this;
|
||||
}
|
||||
|
||||
CStr &CStr::operator=(double Number)
|
||||
{
|
||||
_tsprintf(m_ConversionBuffer, FLOAT_CONVERSION, Number);
|
||||
_tsnprintf(m_ConversionBuffer, CONVERSION_BUFFER_SIZE, FLOAT_CONVERSION, Number);
|
||||
m_String = m_ConversionBuffer;
|
||||
return *this;
|
||||
}
|
||||
@ -432,21 +442,32 @@ size_t CStr::GetHashCode() const
|
||||
|
||||
uint CStr::GetSerializedLength() const
|
||||
{
|
||||
return uint(m_String.length()+1);
|
||||
return uint(m_String.length()*2 + 2);
|
||||
}
|
||||
|
||||
u8 *CStr::Serialize(u8 *buffer) const
|
||||
{
|
||||
size_t length=m_String.length();
|
||||
memcpy(buffer, m_String.c_str(), length+1);
|
||||
return buffer+length+1;
|
||||
size_t i=0;
|
||||
for (i=0;i<length;i++)
|
||||
*(u16 *)(buffer+i*2)=htons(m_String[i]);
|
||||
*(u16 *)(buffer+i*2)=0;
|
||||
return buffer+length*2+2;
|
||||
}
|
||||
|
||||
const u8 *CStr::Deserialize(const u8 *buffer, const u8 *bufferend)
|
||||
{
|
||||
u8 *strend=(u8 *)memchr(buffer, 0, bufferend-buffer);
|
||||
if (strend == NULL)
|
||||
return NULL;
|
||||
*this=(char *)buffer;
|
||||
return strend+1;
|
||||
const u16 *strend=(const u16 *)buffer;
|
||||
while ((const u8 *)strend < bufferend && *strend) strend++;
|
||||
if ((const u8 *)strend >= bufferend) return NULL;
|
||||
|
||||
m_String.resize(strend-((const u16 *)buffer));
|
||||
size_t i=0;
|
||||
const u16 *ptr=(const u16 *)buffer;
|
||||
while (ptr<strend)
|
||||
m_String[i++]=(TCHAR)ntohs(*(ptr++));
|
||||
|
||||
return (const u8 *)(strend+1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -32,7 +32,23 @@ More Info:
|
||||
|
||||
// Last modified: 19 May 04, Mark Thompson (mot20@cam.ac.uk / mark@wildfiregames.com)
|
||||
|
||||
#ifndef CSTR_H
|
||||
#ifndef CSTR_H_FIRST
|
||||
#define CSTR_H_FIRST
|
||||
|
||||
// DEFINES/ENUMS
|
||||
#define CONVERSION_BUFFER_SIZE 32
|
||||
#define FLOAT_CONVERSION _T("%.6f")
|
||||
|
||||
enum PS_TRIM_MODE {PS_TRIM_LEFT, PS_TRIM_RIGHT, PS_TRIM_BOTH};
|
||||
|
||||
#ifndef IN_UNIDOUBLER
|
||||
#define UNIDOUBLER_HEADER "CStr.h"
|
||||
#include "UniDoubler.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if !defined(CSTR_H) || defined(IN_UNIDOUBLER)
|
||||
#define CSTR_H
|
||||
|
||||
#include "Prometheus.h"
|
||||
@ -44,52 +60,41 @@ More Info:
|
||||
#include "Network/Serialization.h"
|
||||
|
||||
#include <cstdlib>
|
||||
using namespace std;
|
||||
|
||||
// DEFINES/ENUMS
|
||||
#define CONVERSION_BUFFER_SIZE 32
|
||||
#define FLOAT_CONVERSION _T("%.6f")
|
||||
|
||||
#ifdef _UNICODE
|
||||
typedef wstring tstring;
|
||||
|
||||
#define tstring wstring
|
||||
#define _tcout wcout
|
||||
#define _tstod wcstod
|
||||
typedef wchar_t TCHAR;
|
||||
#define TCHAR wchar_t
|
||||
#define _ttoi _wtoi
|
||||
#define _ttol _wtol
|
||||
#define _itot _itow
|
||||
#define _ultot _itow
|
||||
#define _T(t) L ## t
|
||||
|
||||
#define _totlower towlower
|
||||
#define _istspace iswspace
|
||||
#define _tsprintf wsprintf
|
||||
#define _tsnprintf swprintf
|
||||
#define _ltot _ltow
|
||||
|
||||
#else
|
||||
|
||||
typedef string tstring;
|
||||
#define tstring string
|
||||
#define _tcout cout
|
||||
#define _tstod strtod
|
||||
#define _ttoi atoi
|
||||
#define _ttol atol
|
||||
#define _itot _itoa
|
||||
typedef char TCHAR;
|
||||
#define TCHAR char
|
||||
#define _T(t) t
|
||||
#define _istspace isspace
|
||||
#define _tsprintf sprintf
|
||||
#define _tsnprintf snprintf
|
||||
#define _totlower tolower
|
||||
#define _ultot _ultoa
|
||||
#define _ltot _ltoa
|
||||
|
||||
#endif
|
||||
|
||||
enum PS_TRIM_MODE {PS_TRIM_LEFT, PS_TRIM_RIGHT, PS_TRIM_BOTH};
|
||||
|
||||
// yuck - MAX already defines a CStr class...
|
||||
#define CStr PS_CStr
|
||||
|
||||
|
||||
// CStr class, the mother of all strings
|
||||
class CStr: public ISerializable
|
||||
{
|
||||
@ -99,7 +104,7 @@ public:
|
||||
CStr(); // Default constructor
|
||||
CStr(const CStr &Str); // Copy Constructor
|
||||
|
||||
CStr(tstring String); // Creates CStr from C++ string
|
||||
CStr(std::tstring String); // Creates CStr from C++ string
|
||||
CStr(const TCHAR* String); // Creates CStr from C-Style TCHAR string
|
||||
CStr(TCHAR Char); // Creates CStr from a TCHAR
|
||||
CStr(int Number); // Creates CStr from a int
|
||||
@ -183,7 +188,7 @@ public:
|
||||
TCHAR &operator[](long n);
|
||||
TCHAR &operator[](unsigned long n);
|
||||
|
||||
inline const char *c_str()
|
||||
inline const TCHAR *c_str()
|
||||
{ return m_String.c_str(); }
|
||||
|
||||
size_t GetHashCode() const;
|
||||
@ -194,7 +199,7 @@ public:
|
||||
virtual const u8 *Deserialize(const u8 *buffer, const u8 *bufferend);
|
||||
|
||||
protected:
|
||||
tstring m_String;
|
||||
std::tstring m_String;
|
||||
TCHAR m_ConversionBuffer[CONVERSION_BUFFER_SIZE];
|
||||
};
|
||||
|
||||
@ -214,6 +219,6 @@ public:
|
||||
};
|
||||
|
||||
// overloaded operator for ostreams
|
||||
ostream &operator<<(ostream &os, CStr &Str);
|
||||
std::ostream &operator<<(std::ostream &os, CStr &Str);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user