1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| #if ((defined EXTERN_FLASH_CODE_PAGE ) && ( FF_CODE_PAGE == 936))
#include "my_file.h"
#define UGBKNAME "UNIGBK.BIN"
#define UGBKSIZE 174344
static WCHAR Extern_FLASH_convert ( /* Converted code, 0 means conversion error */
WCHAR src, /* Character code to be converted */
UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
WCHAR c;
UINT i = 0, n, li, hi;
/* 资源表在flash中的地址 */
static int32_t ugbk_addr = -1;
uint32_t uni2oem_offset=0;
WCHAR t[2];
/* 只加载一次 */
if(ugbk_addr<0)
{
ugbk_addr =GetResOffset(UGBKNAME);
if(ugbk_addr < 0)
{
return 0;
}
ugbk_addr+=RESOURCE_BASE_ADDR;
}
if(dir) //GBK 2 UNICODE
{
uni2oem_offset=UGBKSIZE/2;
} else //UNICODE 2 GBK
{
uni2oem_offset=0;
}
hi=UGBKSIZE/8-1;
li = 0;
for (n = 16; n; n--) {
i = li + (hi - li) / 2;
W25Q_BufferRead((uint8_t *)&t,uni2oem_offset+i*4+ugbk_addr,4);
if (src == t[0]) break;
if (src > t[0]) {
li = i;
} else {
hi = i;
}
}
if (n != 0) c = t[1];
return c;
}
#endif
#if FF_CODE_PAGE >= 900
WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */
DWORD uni, /* UTF-16 encoded character to be converted */
WORD cp /* Code page for the conversion */
)
{
#if ((defined EXTERN_FLASH_CODE_PAGE ) && ( FF_CODE_PAGE == 936))
WCHAR c = 0, uc;
#else
const WCHAR *p;
WCHAR c = 0, uc;
UINT i = 0, n, li, hi;
#endif
if (uni < 0x80) { /* ASCII? */
c = (WCHAR)uni;
} else { /* Non-ASCII */
if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */
uc = (WCHAR)uni;
#if ((defined EXTERN_FLASH_CODE_PAGE ) && ( FF_CODE_PAGE == 936))
c=Extern_FLASH_convert(uc,0);
#else
p = CVTBL(uni2oem, FF_CODE_PAGE);
hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1;
li = 0;
for (n = 16; n; n--) {
i = li + (hi - li) / 2;
if (uc == p[i * 2]) break;
if (uc > p[i * 2]) {
li = i;
} else {
hi = i;
}
}
if (n != 0) c = p[i * 2 + 1];
#endif
}
}
return c;
}
WCHAR ff_oem2uni ( /* Returns Unicode character in UTF-16, zero on error */
WCHAR oem, /* OEM code to be converted */
WORD cp /* Code page for the conversion */
)
{
#if ((defined EXTERN_FLASH_CODE_PAGE ) && ( FF_CODE_PAGE == 936))
WCHAR c = 0;
#else
const WCHAR *p;
WCHAR c = 0;
UINT i = 0, n, li, hi;
#endif
if (oem < 0x80) { /* ASCII? */
c = oem;
} else { /* Extended char */
if (cp == FF_CODE_PAGE) { /* Is it valid code page? */
#if ((defined EXTERN_FLASH_CODE_PAGE ) && ( FF_CODE_PAGE == 936))
c=Extern_FLASH_convert(oem,1);
#else
p = CVTBL(oem2uni, FF_CODE_PAGE);
hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1;
li = 0;
for (n = 16; n; n--) {
i = li + (hi - li) / 2;
if (oem == p[i * 2]) break;
if (oem > p[i * 2]) {
li = i;
} else {
hi = i;
}
}
if (n != 0) c = p[i * 2 + 1];
#endif
}
}
return c;
}
#endif
|