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:
Simon Brenner 2004-06-11 02:55:09 +00:00
parent 6593bc959b
commit 5276a527ae
2 changed files with 62 additions and 36 deletions

View File

@ -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

View File

@ -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