ReactOS 0.4.15-dev-7918-g2a2556c
fold.c
Go to the documentation of this file.
1/*
2 * String folding
3 *
4 * Copyright 2003 Jon Griffiths
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "wine/unicode.h"
22
23static inline WCHAR to_unicode_digit( WCHAR ch )
24{
25 extern const WCHAR wine_digitmap[] DECLSPEC_HIDDEN;
26 return ch + wine_digitmap[wine_digitmap[ch >> 8] + (ch & 0xff)];
27}
28
29static inline WCHAR to_unicode_native( WCHAR ch )
30{
32 return ch + wine_compatmap[wine_compatmap[ch >> 8] + (ch & 0xff)];
33}
34
35static const WCHAR wine_ligatures[] =
36{
37 0x00c6, 0x00de, 0x00df, 0x00e6, 0x00fe, 0x0132, 0x0133, 0x0152,
38 0x0153, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01c8, 0x01c9, 0x01ca,
39 0x01cb, 0x01cc, 0x01e2, 0x01e3, 0x01f1, 0x01f2, 0x01f3, 0x01fc,
40 0x01fd, 0x05f0, 0x05f1, 0x05f2, 0xfb00, 0xfb01, 0xfb02, 0xfb03,
41 0xfb04, 0xfb05, 0xfb06
42};
43
44/* Unicode expanded ligatures */
45static const WCHAR wine_expanded_ligatures[][4] =
46{
47 { 'A','E','\0',1 },
48 { 'T','H','\0',1 },
49 { 's','s','\0',1 },
50 { 'a','e','\0',1 },
51 { 't','h','\0',1 },
52 { 'I','J','\0',1 },
53 { 'i','j','\0',1 },
54 { 'O','E','\0',1 },
55 { 'o','e','\0',1 },
56 { 'D',0x017d,'\0',1 },
57 { 'D',0x017e,'\0',1 },
58 { 'd',0x017e,'\0',1 },
59 { 'L','J','\0',1 },
60 { 'L','j','\0',1 },
61 { 'l','j','\0',1 },
62 { 'N','J','\0',1 },
63 { 'N','j','\0',1 },
64 { 'n','j','\0',1 },
65 { 0x0100,0x0112,'\0',1 },
66 { 0x0101,0x0113,'\0',1 },
67 { 'D','Z','\0',1 },
68 { 'D','z','\0',1 },
69 { 'd','z','\0',1 },
70 { 0x00c1,0x00c9,'\0',1 },
71 { 0x00e1,0x00e9,'\0',1 },
72 { 0x05d5,0x05d5,'\0',1 },
73 { 0x05d5,0x05d9,'\0',1 },
74 { 0x05d9,0x05d9,'\0',1 },
75 { 'f','f','\0',1 },
76 { 'f','i','\0',1 },
77 { 'f','l','\0',1 },
78 { 'f','f','i',2 },
79 { 'f','f','l',2 },
80 { 0x017f,'t','\0',1 },
81 { 's','t','\0',1 }
82};
83
84static inline int get_ligature_len( WCHAR wc )
85{
86 int low = 0, high = sizeof(wine_ligatures)/sizeof(WCHAR) -1;
87 while (low <= high)
88 {
89 int pos = (low + high) / 2;
90 if (wine_ligatures[pos] < wc)
91 low = pos + 1;
92 else if (wine_ligatures[pos] > wc)
93 high = pos - 1;
94 else
96 }
97 return 0;
98}
99
100static inline const WCHAR* get_ligature( WCHAR wc )
101{
102 static const WCHAR empty_ligature[] = { '\0','\0','\0', 0 };
103 int low = 0, high = sizeof(wine_ligatures)/sizeof(WCHAR) -1;
104 while (low <= high)
105 {
106 int pos = (low + high) / 2;
107 if (wine_ligatures[pos] < wc)
108 low = pos + 1;
109 else if (wine_ligatures[pos] > wc)
110 high = pos - 1;
111 else
113 }
114 return empty_ligature;
115}
116
117/* fold a unicode string */
118int wine_fold_string( int flags, const WCHAR *src, int srclen, WCHAR *dst, int dstlen )
119{
120 WCHAR *dstbase = dst;
121 const WCHAR *expand;
122 int i;
123
124 if (srclen == -1)
125 srclen = strlenW(src) + 1; /* Include terminating NUL in count */
126
127 if (!dstlen)
128 {
129 /* Calculate the required size for dst */
130 dstlen = srclen;
131
132 if (flags & MAP_EXPAND_LIGATURES)
133 {
134 while (srclen--)
135 {
137 src++;
138 }
139 }
140 else if (flags & MAP_COMPOSITE)
141 {
142 /* FIXME */
143 }
144 else if (flags & MAP_PRECOMPOSED)
145 {
146 /* FIXME */
147 }
148 return dstlen;
149 }
150
151 if (srclen > dstlen)
152 return 0;
153
154 dstlen -= srclen;
155
156 /* Actually perform the mapping(s) specified */
157 for (i = 0; i < srclen; i++)
158 {
159 WCHAR ch = *src;
160
161 if (flags & MAP_EXPAND_LIGATURES)
162 {
163 expand = get_ligature(ch);
164 if (expand[0])
165 {
166 if (!dstlen--)
167 return 0;
168 dst[0] = expand[0];
169 if (expand[2])
170 {
171 if (!dstlen--)
172 return 0;
173 *++dst = expand[1];
174 ch = expand[2];
175 }
176 else
177 ch = expand[1];
178 dst++;
179 }
180 }
181 else if (flags & MAP_COMPOSITE)
182 {
183 /* FIXME */
184 }
185 else if (flags & MAP_PRECOMPOSED)
186 {
187 /* FIXME */
188 }
189 if (flags & MAP_FOLDDIGITS)
190 ch = to_unicode_digit(ch);
191 if (flags & MAP_FOLDCZONE)
192 ch = to_unicode_native(ch);
193
194 *dst++ = ch;
195 src++;
196 }
197 return dst - dstbase;
198}
static BOOL expand(LPINT ac, LPTSTR **arg, LPCTSTR pattern)
Definition: misc.c:214
const WCHAR DECLSPEC_HIDDEN wine_digitmap[5933]
Definition: digitmap.c:7
const WCHAR DECLSPEC_HIDDEN wine_compatmap[1497]
Definition: digitmap.c:789
#define DECLSPEC_HIDDEN
Definition: precomp.h:8
static WCHAR to_unicode_digit(WCHAR ch)
Definition: fold.c:23
static const WCHAR wine_expanded_ligatures[][4]
Definition: fold.c:45
int wine_fold_string(int flags, const WCHAR *src, int srclen, WCHAR *dst, int dstlen)
Definition: fold.c:118
static WCHAR to_unicode_native(WCHAR ch)
Definition: fold.c:29
static const WCHAR * get_ligature(WCHAR wc)
Definition: fold.c:100
static int get_ligature_len(WCHAR wc)
Definition: fold.c:84
static const WCHAR wine_ligatures[]
Definition: fold.c:35
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static DWORD LPDWORD LPCSTR DWORD srclen
Definition: directory.c:52
static DWORD dstlen
Definition: directory.c:51
#define strlenW(s)
Definition: unicode.h:28
#define MAP_FOLDDIGITS
Definition: winnls.h:214
#define MAP_PRECOMPOSED
Definition: winnls.h:215
#define MAP_COMPOSITE
Definition: winnls.h:216
#define MAP_FOLDCZONE
Definition: winnls.h:213
__wchar_t WCHAR
Definition: xmlstorage.h:180