mirror of https://github.com/roytam1/kmeleon.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
3.6 KiB
198 lines
3.6 KiB
/* |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
*/ |
|
|
|
#ifndef __STRCONV_H_ |
|
#define __STRCONV_H_ |
|
|
|
#include <string> |
|
#include "utf.h" |
|
|
|
template<class T> |
|
class base_convert |
|
{ |
|
public: |
|
|
|
base_convert() : mBuffer(NULL) |
|
{ |
|
mFBuffer[0] = 0; |
|
} |
|
|
|
base_convert(base_convert<T>& op) |
|
{ |
|
Steal(op); |
|
} |
|
|
|
virtual base_convert<T> operator=(base_convert<T>& op) |
|
{ |
|
Reset(); |
|
Steal(op); |
|
return (*this); |
|
} |
|
|
|
virtual ~base_convert() |
|
{ |
|
Reset(); |
|
} |
|
|
|
inline operator const T* () const {return mBuffer;} |
|
|
|
protected: |
|
|
|
void Steal(base_convert<T>& op) |
|
{ |
|
if (op.mBuffer && (op.mBuffer == op.mFBuffer)) { |
|
mBuffer = mFBuffer; |
|
memcpy(mFBuffer, op.mFBuffer, STACK_BUFFER_SIZE*sizeof(T)); |
|
} |
|
else { |
|
mBuffer = op.mBuffer; |
|
op.mBuffer = NULL; |
|
} |
|
} |
|
|
|
void Reset() |
|
{ |
|
if ( mBuffer && (mFBuffer != mBuffer) ) { |
|
delete(mBuffer); |
|
mBuffer = NULL; |
|
} |
|
} |
|
|
|
bool Init(size_t len) |
|
{ |
|
if(len > STACK_BUFFER_SIZE) |
|
{ |
|
mBuffer = new T[len];//static_cast<T*>(malloc(len*sizeof(T))); |
|
if (mBuffer == NULL) |
|
return false; |
|
} |
|
else |
|
mBuffer = mFBuffer; |
|
return true; |
|
} |
|
|
|
T* mBuffer; |
|
T mFBuffer[STACK_BUFFER_SIZE]; |
|
}; |
|
|
|
|
|
class CUTF16_to_ANSI : public base_convert<char> |
|
{ |
|
public: |
|
CUTF16_to_ANSI(const WCHAR* src) |
|
{ |
|
if (!src) return; |
|
|
|
unsigned lengthDst = lstrlenW(src)*2+1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
utf16_to_ansi(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
class CANSI_to_UTF16 : public base_convert<WCHAR> |
|
{ |
|
public: |
|
CANSI_to_UTF16(const char* src) |
|
{ |
|
if (!src) return; |
|
|
|
size_t lengthDst = strlen(src)+1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
ansi_to_utf16(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
class CUTF8_to_UTF16 : public base_convert<WCHAR> |
|
{ |
|
public: |
|
CUTF8_to_UTF16(const char* src) |
|
{ |
|
if (!src) return; |
|
|
|
size_t lengthDst = strlen(src)+1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
utf8_to_utf16(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
class CUTF16_to_UTF8 : public base_convert<char> |
|
{ |
|
public: |
|
CUTF16_to_UTF8(const WCHAR* src) |
|
{ |
|
if (!src) return; |
|
|
|
unsigned lengthDst = lstrlenW(src)*3+1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
utf16_to_utf8(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
class CUTF8_to_ANSI : public base_convert<char> |
|
{ |
|
public: |
|
CUTF8_to_ANSI(const char* src) |
|
{ |
|
if (!src) return; |
|
|
|
size_t lengthDst = strlen(src)+1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
utf8_to_ansi(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
class CANSI_to_UTF8 : public base_convert<char> |
|
{ |
|
public: |
|
CANSI_to_UTF8(const char* src) |
|
{ |
|
if (!src) return; |
|
|
|
size_t lengthDst = strlen(src)*3 + 1; |
|
if (!Init(lengthDst)) |
|
return; |
|
|
|
ansi_to_utf8(src, mBuffer, lengthDst); |
|
} |
|
}; |
|
|
|
#ifdef _UNICODE |
|
#define CANSI_to_T(x) CANSI_to_UTF16(x) |
|
#define CT_to_ANSI(x) CUTF16_to_ANSI(x) |
|
#define CUTF16_to_T(x) (x) |
|
#define CT_to_UTF8 CUTF16_to_UTF8 |
|
#define CUTF8_to_T CUTF8_to_UTF16 |
|
#else // Blarg |
|
#define CANSI_to_T(x) (x) |
|
#define CT_to_ANSI(x) (x) |
|
#define CUTF16_to_T(x) CUTF16_to_ANSI(x) |
|
#define CT_to_UTF8(x) CANSI_to_UTF8(x) |
|
#define CUTF8_to_T(x) CUTF8_to_ANSI(x) |
|
#endif |
|
|
|
|
|
#endif // __STRCONV_H_
|