| // 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" | |
| #include "unicodenormalizationdata.h" | |
| const FX_WCHAR* const g_UnicodeData_Normalization_Maps[5] = { | |
| nullptr, | |
| 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; | |
| } |