Fix clang compile

This commit is contained in:
JusicP 2021-04-28 18:24:16 +03:00
parent c70e496e72
commit d349b1769a
15 changed files with 65 additions and 47 deletions

View File

@ -336,8 +336,11 @@ void CTextConsoleUnix::ShutDown()
pthread_t tid = g_threadid; pthread_t tid = g_threadid;
g_threadid = (pthread_t)-1; g_threadid = (pthread_t)-1;
#if defined ( ANDROID )
pthread_kill( tid, SIGUSR1 );
#else
pthread_cancel( tid ); pthread_cancel( tid );
#endif
pthread_join( tid, &status ); pthread_join( tid, &status );
} }

View File

@ -343,8 +343,8 @@ public:
bool IsOverlapping( const Extent &extent ) const; // return true if 'extent' overlaps our 2D extents bool IsOverlapping( const Extent &extent ) const; // return true if 'extent' overlaps our 2D extents
bool IsOverlappingX( const CNavArea *area ) const; // return true if 'area' overlaps our X extent bool IsOverlappingX( const CNavArea *area ) const; // return true if 'area' overlaps our X extent
bool IsOverlappingY( const CNavArea *area ) const; // return true if 'area' overlaps our Y extent bool IsOverlappingY( const CNavArea *area ) const; // return true if 'area' overlaps our Y extent
inline float GetZ( const Vector * RESTRICT pPos ) const ; // return Z of area at (x,y) of 'pos' inline float GetZ( const Vector * RESTRICT pPos ) const RESTRICT ; // return Z of area at (x,y) of 'pos'
inline float GetZ( const Vector &pos ) const; // return Z of area at (x,y) of 'pos' inline float GetZ( const Vector &pos ) const RESTRICT; // return Z of area at (x,y) of 'pos'
float GetZ( float x, float y ) const RESTRICT; // return Z of area at (x,y) of 'pos' float GetZ( float x, float y ) const RESTRICT; // return Z of area at (x,y) of 'pos'
bool Contains( const Vector &pos ) const; // return true if given point is on or above this area, but no others bool Contains( const Vector &pos ) const; // return true if given point is on or above this area, but no others
bool Contains( const CNavArea *area ) const; bool Contains( const CNavArea *area ) const;

2
ivp

@ -1 +1 @@
Subproject commit 58cb1243b4b2b005eeed808df84e994942c84751 Subproject commit 64e06cde5f7b651eb794a5c46ac1ceae198ec182

View File

@ -113,7 +113,7 @@ private:
float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut );
void BumpedLightmapBitsToPixelWriter_HDRI( float* pFloatImage, float *pFloatImageBump1, float *pFloatImageBump2, void BumpedLightmapBitsToPixelWriter_HDRI( float* pFloatImage, float *pFloatImageBump1, float *pFloatImageBump2,
float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ) RESTRICT;
void LightmapBitsToPixelWriter_LDR( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); void LightmapBitsToPixelWriter_LDR( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut );
void LightmapBitsToPixelWriter_HDRF( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); void LightmapBitsToPixelWriter_HDRF( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut );

View File

@ -4243,6 +4243,13 @@ ZRESULT TUnzip::Unzip(int index,void *dst,unsigned int len,DWORD flags)
{ {
#ifdef _WIN32 #ifdef _WIN32
SetFileTime(h,&ze.ctime,&ze.atime,&ze.mtime); SetFileTime(h,&ze.ctime,&ze.atime,&ze.mtime);
#elif defined( ANDROID )
struct timespec ts[2];
ts[0].tv_sec = ze.atime;
ts[0].tv_nsec = 0;
ts[1].tv_sec = ze.mtime;
ts[1].tv_nsec = 0;
utimensat((int)h, NULL, ts, 0);
#else #else
struct timeval tv[2]; struct timeval tv[2];
tv[0].tv_sec = ze.atime; tv[0].tv_sec = ze.atime;

View File

@ -1244,11 +1244,11 @@ inline void CVertexBuilder::FastVertexSSE( const ModelVertexDX7_t &vertex )
const char *pRead = (char *)&vertex; const char *pRead = (char *)&vertex;
char *pCurrPos = (char *)m_pCurrPosition; char *pCurrPos = (char *)m_pCurrPosition;
__m128 m1 = _mm_load_ps( (float *)pRead ); __m128 m1 = _mm_load_ps( (float *)pRead );
__m128 m2 = _mm_load_ps( (float *)(pRead + 16) ); __m128 m2 = _mm_load_ps( (float *)((int)pRead + 16) );
__m128 m3 = _mm_load_ps( (float *)(pRead + 32) ); __m128 m3 = _mm_load_ps( (float *)((int)pRead + 32) );
_mm_stream_ps( (float *)pCurrPos, m1 ); _mm_stream_ps( (float *)pCurrPos, m1 );
_mm_stream_ps( (float *)(pCurrPos + 16), m2 ); _mm_stream_ps( (float *)((int)pCurrPos + 16), m2 );
_mm_stream_ps( (float *)(pCurrPos + 32), m3 ); _mm_stream_ps( (float *)((int)pCurrPos + 32), m3 );
#else #else
Error( "Implement CMeshBuilder::FastVertexSSE(dx7)" ); Error( "Implement CMeshBuilder::FastVertexSSE(dx7)" );
#endif #endif
@ -1436,13 +1436,13 @@ inline void CVertexBuilder::FastVertexSSE( const ModelVertexDX8_t &vertex )
:: "r" (pRead), "r" (pCurrPos) : "memory"); */ :: "r" (pRead), "r" (pCurrPos) : "memory"); */
__m128 m1 = _mm_load_ps( (float *)pRead ); __m128 m1 = _mm_load_ps( (float *)pRead );
__m128 m2 = _mm_load_ps( (float *)(pRead + 16) ); __m128 m2 = _mm_load_ps( (float *)((int)pRead + 16) );
__m128 m3 = _mm_load_ps( (float *)(pRead + 32) ); __m128 m3 = _mm_load_ps( (float *)((int)pRead + 32) );
__m128 m4 = _mm_load_ps( (float *)(pRead + 48) ); __m128 m4 = _mm_load_ps( (float *)((int)pRead + 48) );
_mm_stream_ps( (float *)pCurrPos, m1 ); _mm_stream_ps( (float *)pCurrPos, m1 );
_mm_stream_ps( (float *)(pCurrPos + 16), m2 ); _mm_stream_ps( (float *)((int)pCurrPos + 16), m2 );
_mm_stream_ps( (float *)(pCurrPos + 32), m3 ); _mm_stream_ps( (float *)((int)pCurrPos + 32), m3 );
_mm_stream_ps( (float *)(pCurrPos + 48), m4 ); _mm_stream_ps( (float *)((int)pCurrPos + 48), m4 );
#else #else
Error( "Implement CMeshBuilder::FastVertexSSE((dx8)" ); Error( "Implement CMeshBuilder::FastVertexSSE((dx8)" );
#endif #endif

View File

@ -42,28 +42,28 @@ public:
FORCEINLINE void ActivateByteSwapping( bool bSwap ); FORCEINLINE void ActivateByteSwapping( bool bSwap );
#endif #endif
FORCEINLINE void Seek( int x, int y ); FORCEINLINE void Seek( int x, int y ) RESTRICT;
FORCEINLINE void* SkipBytes( int n ); FORCEINLINE void* SkipBytes( int n ) RESTRICT;
FORCEINLINE void SkipPixels( int n ); FORCEINLINE void SkipPixels( int n );
FORCEINLINE void WritePixel( int r, int g, int b, int a = 255 ); FORCEINLINE void WritePixel( int r, int g, int b, int a = 255 );
FORCEINLINE void WritePixelNoAdvance( int r, int g, int b, int a = 255 ); FORCEINLINE void WritePixelNoAdvance( int r, int g, int b, int a = 255 ) RESTRICT;
FORCEINLINE void WritePixelSigned( int r, int g, int b, int a = 255 ); FORCEINLINE void WritePixelSigned( int r, int g, int b, int a = 255 );
FORCEINLINE void WritePixelNoAdvanceSigned( int r, int g, int b, int a = 255 ); FORCEINLINE void WritePixelNoAdvanceSigned( int r, int g, int b, int a = 255 );
FORCEINLINE void ReadPixelNoAdvance( int &r, int &g, int &b, int &a ); FORCEINLINE void ReadPixelNoAdvance( int &r, int &g, int &b, int &a );
// Floating point formats // Floating point formats
FORCEINLINE void WritePixelNoAdvanceF( float r, float g, float b, float a = 1.0f ); FORCEINLINE void WritePixelNoAdvanceF( float r, float g, float b, float a = 1.0f ) RESTRICT;
FORCEINLINE void WritePixelF( float r, float g, float b, float a = 1.0f ); FORCEINLINE void WritePixelF( float r, float g, float b, float a = 1.0f );
// SIMD formats // SIMD formats
FORCEINLINE void WritePixel( FLTX4 rgba ); FORCEINLINE void WritePixel( FLTX4 rgba ) RESTRICT;
FORCEINLINE void WritePixelNoAdvance( FLTX4 rgba ); FORCEINLINE void WritePixelNoAdvance( FLTX4 rgba );
#ifdef _X360 #ifdef _X360
// here are some explicit formats so we can avoid the switch: // here are some explicit formats so we can avoid the switch:
FORCEINLINE void WritePixelNoAdvance_RGBA8888( FLTX4 rgba ); FORCEINLINE void WritePixelNoAdvance_RGBA8888( FLTX4 rgba );
FORCEINLINE void WritePixelNoAdvance_BGRA8888( FLTX4 rgba ); FORCEINLINE void WritePixelNoAdvance_BGRA8888( FLTX4 rgba );
// as above, but with m_pBits passed in to avoid a LHS // as above, but with m_pBits passed in to avoid a LHS
FORCEINLINE void WritePixelNoAdvance_BGRA8888( FLTX4 rgba, void *pBits ); FORCEINLINE void WritePixelNoAdvance_BGRA8888( FLTX4 rgba, void *pBits ) RESTRICT;
// for writing entire SIMD registers at once when they have // for writing entire SIMD registers at once when they have
// already been packed, and when m_pBits is vector-aligned // already been packed, and when m_pBits is vector-aligned
// (which is a requirement for write-combined memory) // (which is a requirement for write-combined memory)
@ -73,9 +73,9 @@ public:
#endif #endif
FORCEINLINE unsigned char GetPixelSize() { return m_Size; } FORCEINLINE unsigned char GetPixelSize() RESTRICT { return m_Size; }
FORCEINLINE bool IsUsingFloatFormat() const; FORCEINLINE bool IsUsingFloatFormat() RESTRICT const;
FORCEINLINE unsigned char *GetCurrentPixel() { return m_pBits; } FORCEINLINE unsigned char *GetCurrentPixel() { return m_pBits; }
private: private:
@ -108,7 +108,7 @@ private:
#endif #endif
}; };
FORCEINLINE_PIXEL bool CPixelWriter::IsUsingFloatFormat() const FORCEINLINE_PIXEL bool CPixelWriter::IsUsingFloatFormat() RESTRICT const
{ {
return (m_nFlags & PIXELWRITER_USING_FLOAT_FORMAT) != 0; return (m_nFlags & PIXELWRITER_USING_FLOAT_FORMAT) != 0;
} }
@ -379,7 +379,7 @@ FORCEINLINE void CPixelWriter::ActivateByteSwapping( bool bSwap )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Sets where we're writing to // Sets where we're writing to
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
FORCEINLINE_PIXEL void CPixelWriter::Seek( int x, int y ) FORCEINLINE_PIXEL void CPixelWriter::Seek( int x, int y ) RESTRICT
{ {
m_pBits = m_pBase + y * m_BytesPerRow + x * m_Size; m_pBits = m_pBase + y * m_BytesPerRow + x * m_Size;
} }
@ -407,7 +407,7 @@ FORCEINLINE_PIXEL void CPixelWriter::SkipPixels( int n )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Writes a pixel without advancing the index PC ONLY // Writes a pixel without advancing the index PC ONLY
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
FORCEINLINE_PIXEL void CPixelWriter::WritePixelNoAdvanceF( float r, float g, float b, float a ) FORCEINLINE_PIXEL void CPixelWriter::WritePixelNoAdvanceF( float r, float g, float b, float a ) RESTRICT
{ {
Assert( IsUsingFloatFormat() ); Assert( IsUsingFloatFormat() );
@ -473,7 +473,7 @@ FORCEINLINE_PIXEL void CPixelWriter::WritePixelSigned( int r, int g, int b, int
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Writes a pixel without advancing the index // Writes a pixel without advancing the index
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
FORCEINLINE_PIXEL void CPixelWriter::WritePixelNoAdvance( int r, int g, int b, int a ) FORCEINLINE_PIXEL void CPixelWriter::WritePixelNoAdvance( int r, int g, int b, int a ) RESTRICT
{ {
Assert( !IsUsingFloatFormat() ); Assert( !IsUsingFloatFormat() );

View File

@ -2655,8 +2655,8 @@ public:
const void *m_expectedVModel; const void *m_expectedVModel;
// double-check that the data I point to hasn't changed // double-check that the data I point to hasn't changed
bool ValidateAgainst( const CStudioHdr * RESTRICT pstudiohdr ); bool ValidateAgainst( const CStudioHdr * RESTRICT pstudiohdr ) RESTRICT;
void SetValidationPair( const CStudioHdr *RESTRICT pstudiohdr ); void SetValidationPair( const CStudioHdr *RESTRICT pstudiohdr ) RESTRICT;
friend class CStudioHdr; friend class CStudioHdr;
}; };

View File

@ -181,7 +181,7 @@ public:
void WriteOneBitAt( int iBit, int nValue ); void WriteOneBitAt( int iBit, int nValue );
// Write signed or unsigned. Range is only checked in debug. // Write signed or unsigned. Range is only checked in debug.
void WriteUBitLong( unsigned int data, int numbits, bool bCheckRange=true ); void WriteUBitLong( unsigned int data, int numbits, bool bCheckRange=true ) RESTRICT;
void WriteSBitLong( int data, int numbits ); void WriteSBitLong( int data, int numbits );
// Tell it whether or not the data is unsigned. If it's signed, // Tell it whether or not the data is unsigned. If it's signed,
@ -241,7 +241,7 @@ public:
int GetNumBytesWritten() const; int GetNumBytesWritten() const;
int GetNumBitsWritten() const; int GetNumBitsWritten() const;
int GetMaxNumBits(); int GetMaxNumBits();
int GetNumBitsLeft(); int GetNumBitsLeft() RESTRICT;
int GetNumBytesLeft(); int GetNumBytesLeft();
unsigned char* GetData(); unsigned char* GetData();
const unsigned char* GetData() const; const unsigned char* GetData() const;
@ -250,7 +250,7 @@ public:
bool CheckForOverflow(int nBits); bool CheckForOverflow(int nBits);
inline bool IsOverflowed() const {return m_bOverflow;} inline bool IsOverflowed() const {return m_bOverflow;}
void SetOverflowFlag(); void SetOverflowFlag() RESTRICT;
public: public:
@ -292,7 +292,7 @@ inline int bf_write::GetMaxNumBits()
return m_nDataBits; return m_nDataBits;
} }
inline int bf_write::GetNumBitsLeft() inline int bf_write::GetNumBitsLeft() RESTRICT
{ {
return m_nDataBits - m_iCurBit; return m_nDataBits - m_iCurBit;
} }
@ -323,7 +323,7 @@ BITBUF_INLINE bool bf_write::CheckForOverflow(int nBits)
return m_bOverflow; return m_bOverflow;
} }
BITBUF_INLINE void bf_write::SetOverflowFlag() BITBUF_INLINE void bf_write::SetOverflowFlag() RESTRICT
{ {
#ifdef DBGFLAG_ASSERT #ifdef DBGFLAG_ASSERT
if ( m_bAssertOnOverflow ) if ( m_bAssertOnOverflow )
@ -635,7 +635,7 @@ public:
public: public:
int GetNumBytesLeft(); int GetNumBytesLeft();
int GetNumBytesRead(); int GetNumBytesRead();
int GetNumBitsLeft(); int GetNumBitsLeft() RESTRICT;
int GetNumBitsRead() const; int GetNumBitsRead() const;
// Has the buffer overflowed? // Has the buffer overflowed?
@ -645,7 +645,7 @@ public:
inline bool SeekRelative(int iBitDelta); // Seek to an offset from the current position. inline bool SeekRelative(int iBitDelta); // Seek to an offset from the current position.
// Called when the buffer is overflowed. // Called when the buffer is overflowed.
void SetOverflowFlag(); void SetOverflowFlag() RESTRICT;
public: public:
@ -678,7 +678,7 @@ inline int bf_read::GetNumBytesRead()
return BitByte(m_iCurBit); return BitByte(m_iCurBit);
} }
inline int bf_read::GetNumBitsLeft() inline int bf_read::GetNumBitsLeft() RESTRICT
{ {
return m_nDataBits - m_iCurBit; return m_nDataBits - m_iCurBit;
} }

View File

@ -386,7 +386,7 @@ DBG_INTERFACE bool ShouldUseNewAssertDialog()
#endif // DBGFLAG_ASSERTDLG #endif // DBGFLAG_ASSERTDLG
} }
#if defined( POSIX ) #if defined( POSIX ) && !defined ( ANDROID )
#include <execinfo.h> #include <execinfo.h>
@ -441,7 +441,9 @@ DBG_INTERFACE bool DoNewAssertDialog( const tchar *pFilename, int line, const tc
pFilename, line, pExpression); pFilename, line, pExpression);
if ( getenv( "POSIX_ASSERT_BACKTRACE" ) ) if ( getenv( "POSIX_ASSERT_BACKTRACE" ) )
{ {
#if !defined ( ANDROID )
SpewBacktrace(); SpewBacktrace();
#endif
} }
} }
else else

View File

@ -124,9 +124,13 @@ float GetCPUUsage()
float GetCPUUsage() float GetCPUUsage()
{ {
#ifdef ANDROID
return 0;
#else
double loadavg[3]; double loadavg[3];
getloadavg( loadavg, 3 ); getloadavg( loadavg, 3 );
return loadavg[0]; return loadavg[0];
#endif
} }
#endif //POSIX #endif //POSIX

View File

@ -1,4 +1,4 @@
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// //===== Copyright <EFBFBD> 1996-2005, Valve Corporation, All rights reserved. ======//
// //
// Purpose: // Purpose:
// //
@ -27,7 +27,7 @@
#include <set> #include <set>
#endif #endif
#if defined( LINUX ) #if defined( LINUX ) && !defined( ANDROID )
#include <execinfo.h> #include <execinfo.h>
#endif #endif
@ -38,7 +38,7 @@
#if !defined( ENABLE_RUNTIME_STACK_TRANSLATION ) //disable the whole toolset #if !defined( ENABLE_RUNTIME_STACK_TRANSLATION ) //disable the whole toolset
#if defined( LINUX ) #if defined( LINUX ) && !defined( ANDROID )
int GetCallStack( void **pReturnAddressesOut, int iArrayCount, int iSkipCount ) int GetCallStack( void **pReturnAddressesOut, int iArrayCount, int iSkipCount )
{ {

View File

@ -2034,6 +2034,8 @@ void CThread::Yield()
{ {
#ifdef _WIN32 #ifdef _WIN32
::Sleep(0); ::Sleep(0);
#elif defined(ANDROID)
sched_yield();
#elif defined(POSIX) #elif defined(POSIX)
pthread_yield(); pthread_yield();
#endif #endif

View File

@ -849,7 +849,7 @@ void bf_read::SetDebugName( const char *pName )
m_pDebugName = pName; m_pDebugName = pName;
} }
void bf_read::SetOverflowFlag() void bf_read::SetOverflowFlag() RESTRICT
{ {
if ( m_bAssertOnOverflow ) if ( m_bAssertOnOverflow )
{ {
@ -992,7 +992,7 @@ unsigned int bf_read::PeekUBitLong( int numbits )
return r; return r;
} }
unsigned int bf_read::ReadUBitLongNoInline( int numbits ) unsigned int bf_read::ReadUBitLongNoInline( int numbits ) RESTRICT
{ {
return ReadUBitLong( numbits ); return ReadUBitLong( numbits );
} }

View File

@ -1421,7 +1421,7 @@ int _V_UCS2ToUnicode( const ucs2 *pUCS2, wchar_t *pUnicode, int cubDestSizeInByt
size_t nMaxUTF8 = cubDestSizeInBytes; size_t nMaxUTF8 = cubDestSizeInBytes;
char *pIn = (char *)pUCS2; char *pIn = (char *)pUCS2;
char *pOut = (char *)pUnicode; char *pOut = (char *)pUnicode;
if ( conv_t > 0 ) if ( conv_t > (void*)0 )
{ {
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 ); cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
iconv_close( conv_t ); iconv_close( conv_t );
@ -1461,7 +1461,7 @@ int _V_UnicodeToUCS2( const wchar_t *pUnicode, int cubSrcInBytes, char *pUCS2, i
size_t nMaxUCS2 = cubDestSizeInBytes; size_t nMaxUCS2 = cubDestSizeInBytes;
char *pIn = (char*)pUnicode; char *pIn = (char*)pUnicode;
char *pOut = pUCS2; char *pOut = pUCS2;
if ( conv_t > 0 ) if ( conv_t > (void*)0 )
{ {
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUCS2 ); cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUCS2 );
iconv_close( conv_t ); iconv_close( conv_t );
@ -1509,7 +1509,7 @@ int _V_UCS2ToUTF8( const ucs2 *pUCS2, char *pUTF8, int cubDestSizeInBytes )
size_t nMaxUTF8 = cubDestSizeInBytes - 1; size_t nMaxUTF8 = cubDestSizeInBytes - 1;
char *pIn = (char *)pUCS2; char *pIn = (char *)pUCS2;
char *pOut = (char *)pUTF8; char *pOut = (char *)pUTF8;
if ( conv_t > 0 ) if ( conv_t > (void*)0 )
{ {
const size_t nBytesToWrite = nMaxUTF8; const size_t nBytesToWrite = nMaxUTF8;
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 ); cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
@ -1554,7 +1554,7 @@ int _V_UTF8ToUCS2( const char *pUTF8, int cubSrcInBytes, ucs2 *pUCS2, int cubDes
size_t nMaxUTF8 = cubDestSizeInBytes; size_t nMaxUTF8 = cubDestSizeInBytes;
char *pIn = (char *)pUTF8; char *pIn = (char *)pUTF8;
char *pOut = (char *)pUCS2; char *pOut = (char *)pUCS2;
if ( conv_t > 0 ) if ( conv_t > (void*)0 )
{ {
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 ); cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
iconv_close( conv_t ); iconv_close( conv_t );