| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #include "../../include/fxcrt/fx_string.h" |
| |
| extern const FX_WCHAR g_UnicodeData_Normalization[]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map1[]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map2[]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map3[]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map4[]; |
| const FX_WCHAR* g_UnicodeData_Normalization_Maps[5] = { |
| NULL, |
| g_UnicodeData_Normalization_Map1, |
| g_UnicodeData_Normalization_Map2, |
| g_UnicodeData_Normalization_Map3, |
| g_UnicodeData_Normalization_Map4 |
| }; |
| FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_WCHAR* pDst) |
| { |
| wch = wch & 0xFFFF; |
| FX_WCHAR wFind = g_UnicodeData_Normalization[wch]; |
| if (!wFind) { |
| if (pDst) { |
| *pDst = wch; |
| } |
| return 1; |
| } |
| if(wFind >= 0x8000) { |
| wch = wFind - 0x8000; |
| wFind = 1; |
| } else { |
| wch = wFind & 0x0FFF; |
| wFind >>= 12; |
| } |
| const FX_WCHAR* pMap = g_UnicodeData_Normalization_Maps[wFind]; |
| if (pMap == g_UnicodeData_Normalization_Map4) { |
| pMap = g_UnicodeData_Normalization_Map4 + wch; |
| wFind = (FX_WCHAR)(*pMap ++); |
| } else { |
| pMap += wch; |
| } |
| if (pDst) { |
| FX_WCHAR n = wFind; |
| while (n --) { |
| *pDst ++ = *pMap ++; |
| } |
| } |
| return (FX_STRSIZE)wFind; |
| } |
| FX_STRSIZE FX_WideString_GetNormalization(const CFX_WideStringC& wsSrc, FX_WCHAR* pDst) |
| { |
| FX_STRSIZE nCount = 0; |
| for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) { |
| FX_WCHAR wch = wsSrc.GetAt(len); |
| if(pDst) { |
| nCount += FX_Unicode_GetNormalization(wch, pDst + nCount); |
| } else { |
| nCount += FX_Unicode_GetNormalization(wch, pDst); |
| } |
| } |
| return nCount; |
| } |
| FX_STRSIZE FX_WideString_GetNormalization(const CFX_WideStringC& wsSrc, CFX_WideString &wsDst) |
| { |
| FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_WCHAR*)NULL); |
| if (!nLen) { |
| return 0; |
| } |
| FX_WCHAR* pBuf = wsDst.GetBuffer(nLen); |
| FX_WideString_GetNormalization(wsSrc, pBuf); |
| wsDst.ReleaseBuffer(nLen); |
| return nLen; |
| } |