utex.h at tip Вы: nobody
Вход

File sqlite1c/SQL_DBF/utex.h from the latest check-in


// utex.h
#pragma once
//        UTF-16  UTF-8 
#include <fixalloc.h>

struct u8text
{
	static void init();
	//static CString toUtf8(const CString& strSource);
	static void toUtf8(CString& strWinText)
	{
		int sl = strWinText.GetLength() * 3 + 3;
		char buffer[1024];
		char *pWrite = (sl <= sizeof(buffer) ? buffer : new char[sl]), *pStart = pWrite;
		LPCSTR pRead = strWinText;
		while(DWORD s = static_cast<DWORD>(static_cast<BYTE>(*pRead)))
		{
			int d = s - 128;
			if(d >= 0)
			{
				DWORD us = w12512u[d];
				*((DWORD*)pWrite) = us;
				pWrite++;
				if(us & 0xFF0000)
					pWrite++;
			}
			else
				*pWrite = s;
			pWrite++;
			pRead++;
		}
		int newLen = pWrite - pStart;
		if(newLen != strWinText.GetLength())
			memcpy(strWinText.GetBufferSetLength(newLen), pStart, newLen);
		if(sl > sizeof(buffer))
			delete [] pStart;
	}

	static CString fromUtf8(LPCSTR strSrc);
	static void fromUtf8(LPCSTR strSrc, CString& res);
	static int _1Ccollate(void*, int l1, const void* str1, int l2, const void* str2);
	static int compareRtrimNoCase(LPCSTR str1, LPCSTR str2);
	static int compareRtrim(LPCSTR str1, LPCSTR str2);
	static int compareLen(LPCSTR str1, LPCSTR str2, DWORD len)
	{
		return memcmp(str1, str2, len);
	}
	static int compareNoCaseLen(LPCSTR str1, LPCSTR str2, DWORD len);
	static void dbUpper(CString& str);

private:
	static const DWORD w12512u[128];
	static CMapPtrToPtr uw1251;
};