Move extern fpdf_font_charset.cpp function prototypes to header.
[pdfium.git] / core / src / fpdftext / unicodenormalization.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/fxcrt/fx_string.h"
8
9 extern const FX_WCHAR g_UnicodeData_Normalization[];
10 extern const FX_WCHAR g_UnicodeData_Normalization_Map1[];
11 extern const FX_WCHAR g_UnicodeData_Normalization_Map2[];
12 extern const FX_WCHAR g_UnicodeData_Normalization_Map3[];
13 extern const FX_WCHAR g_UnicodeData_Normalization_Map4[];
14 const FX_WCHAR* g_UnicodeData_Normalization_Maps[5] = {
15     NULL,
16     g_UnicodeData_Normalization_Map1,
17     g_UnicodeData_Normalization_Map2,
18     g_UnicodeData_Normalization_Map3,
19     g_UnicodeData_Normalization_Map4
20 };
21 FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_WCHAR* pDst)
22 {
23     wch = wch & 0xFFFF;
24     FX_WCHAR wFind = g_UnicodeData_Normalization[wch];
25     if (!wFind) {
26         if (pDst) {
27             *pDst = wch;
28         }
29         return 1;
30     }
31     if(wFind >= 0x8000) {
32         wch = wFind - 0x8000;
33         wFind = 1;
34     } else {
35         wch = wFind & 0x0FFF;
36         wFind >>= 12;
37     }
38     const FX_WCHAR* pMap = g_UnicodeData_Normalization_Maps[wFind];
39     if (pMap == g_UnicodeData_Normalization_Map4) {
40         pMap = g_UnicodeData_Normalization_Map4 + wch;
41         wFind = (FX_WCHAR)(*pMap ++);
42     } else {
43         pMap += wch;
44     }
45     if (pDst) {
46         FX_WCHAR n = wFind;
47         while (n --) {
48             *pDst ++ = *pMap ++;
49         }
50     }
51     return (FX_STRSIZE)wFind;
52 }
53 FX_STRSIZE FX_WideString_GetNormalization(const CFX_WideStringC& wsSrc, FX_WCHAR* pDst)
54 {
55     FX_STRSIZE nCount = 0;
56     for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {
57         FX_WCHAR wch = wsSrc.GetAt(len);
58         if(pDst) {
59             nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);
60         } else {
61             nCount += FX_Unicode_GetNormalization(wch, pDst);
62         }
63     }
64     return nCount;
65 }
66 FX_STRSIZE FX_WideString_GetNormalization(const CFX_WideStringC& wsSrc, CFX_WideString &wsDst)
67 {
68     FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_WCHAR*)NULL);
69     if (!nLen) {
70         return 0;
71     }
72     FX_WCHAR* pBuf = wsDst.GetBuffer(nLen);
73     FX_WideString_GetNormalization(wsSrc, pBuf);
74     wsDst.ReleaseBuffer(nLen);
75     return nLen;
76 }