OSCL在OpenCORE中扮演了舉足輕重的角色,提供了跨平臺特性的支持,要求底層系統(tǒng)能夠提供如動態(tài)內(nèi)容管理、線程、文件I/O、網(wǎng)絡套接字、DNS(Domain Name Services)和時間服務等。
如果希望將OpenCORE向一個新平臺移植,主要工作就是在OSCL層進行的,下面介紹OSCL中涉及的常用的字符編碼格式的轉(zhuǎn)換情況。
Unicode向UTF8轉(zhuǎn)換的算法為:
代碼1-1 Unicode向UTF8轉(zhuǎn)換的過程
OSCL_EXPORT_REF int32 oscl_UnicodeToUTF8(const oscl_wchar *szSrc, int32 nSrcLen, char *strDest, int32 nDestLen)
{
int32 i=0;
int32 i_cur_output=0;
char ch_tmp_byte;
if (nDestLen<=0)
{
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
for (i=0; i< nSrcLen; i++)
{
if (BYTE_1_REP>szSrc[i]) /* 1個字節(jié)utf8表示*/
{
if (i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(char)szSrc[i];
}
else
{
//設置結(jié)束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (BYTE_2_REP>szSrc[i]) /* 2個字節(jié)utf8表示*/
{
if (i_cur_output+2< nDestLen)
{
strDest[i_cur_output++]=(char)(szSrc[i]>>6 | 0xc0);
strDest[i_cur_output++]=(char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
strDest[i_cur_output]='\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (SURROGATE_MAX>szSrc[i] && SURROGATE_MIN< szSrc[i])
{ /* 4個字節(jié)代理對表示*/
if (i_cur_output+4< nDestLen)
{
ch_tmp_byte=(char)(((szSrc[i] & 0x3c0)>>6)+1);
strDest[i_cur_output++]=(char)(ch_tmp_byte>>2 | 0xf0);
strDest[i_cur_output++]=(char)(((ch_tmp_byte & 0x03) | 0x80) | (szSrc[i]& 0x3e) >> 2);
}
else
{
//設置結(jié)束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else /* 3個字節(jié)utf8表示*/
{
if (i_cur_output+3< nDestLen)
{
strDest[i_cur_output++]=(char)(szSrc[i]>>12 | 0xe0);
strDest[i_cur_output++]=(char)(((szSrc[i]>>6) & 0x3f) | 0x80);
strDest[i_cur_output++]=(char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
//設置結(jié)束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
}
//設置結(jié)束符
strDest[i_cur_output]='\0';
//以字節(jié)為單位返回
return i_cur_output;
}
UTF8向Unicode轉(zhuǎn)換的算法為:
代碼1-2 UTF8向Unicode轉(zhuǎn)換的過程
OSCL_EXPORT_REF int32 oscl_UTF8ToUnicode(const char *szSrc, int32 nSrcLen, oscl_wchar *strDest, int32 nDestLen)
{
int32 i=0;
int32 i_cur_output=0;
if (nDestLen<=0)
{
// We cannot append terminate 0 at this case.
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
unsigned char *pszSrc=(unsigned char *)szSrc;
while (i< nSrcLen)
{
//處理代理對
if (SIGMASK_3_1 <= pszSrc[i])
{
if (i+2< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)(((wchar_t)pszSrc[i]<<12) |(((wchar_t)pszSrc[i+1] & 0x3f)<<6) |((wchar_t)pszSrc[i+2] & 0x3f));
i += 3;
}
else
{
//設置結(jié)束符
strDest[i_cur_output]=0;
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (SIGMASK_2_1 <= pszSrc[i]) /*
{
if (i+1< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)(((wchar_t)pszSrc[i] & ~0xc0)<<6 |((wchar_t)pszSrc[i+1] & ~0x80));
i+=2;
}
else
{
//設置結(jié)束符
strDest[i_cur_output]=0; /
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else /*單個字節(jié)表示*/
{
if (i< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)pszSrc[i];
++i;
}
else
{
//設置結(jié)束符
strDest[i_cur_output]=0;
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
}
//設置結(jié)束符
strDest[i_cur_output]=0;
return i_cur_output;
}