-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathiso2022_jp.cpp
58 lines (52 loc) · 1.47 KB
/
iso2022_jp.cpp
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
#include "iso2022_jp.h"
map<string,iso2022_jp_pair> iso2022_jp_detect = {
{("\x1b(B"),{1,[](const uchar* str){return true;}}},
{("\x1b(J"),{1,[](const uchar* str){return true;}}},
{("\x1b$@"),{2,[](const uchar* str){return true;}}},
{("\x1b$B"),{2,[](const uchar* str){return true;}}}};
ISO2022_JPChecker::ISO2022_JPChecker()
:CheckerBase("iso2022_jp")
{
}
bool ISO2022_JPChecker::detect(string str) const
{
const char* buffer = str.c_str();
// default encoding is ascii
iso2022_jp_pair func = {1,[](const uchar*s){return *s<=0x7F;}};
while(strlen(buffer))
{
auto result = check_flag(buffer);
if(get<0>(result)) // flag detected
{
func = get<1>(result);
}
else // continue old encoding
{
if(func.second((const uchar*)buffer))
{
buffer += func.first;
}
else
{
break;
}
}
}
return (strlen(buffer)==0);
}
tuple<bool, iso2022_jp_pair> ISO2022_JPChecker::check_flag(const char *&str) const
{
tuple<bool, iso2022_jp_pair> ret=make_tuple(false,iso2022_jp_pair());
for(auto& x:iso2022_jp_detect)
{
string flag = x.first;
if(!strncmp(flag.c_str(),(const char*)str,flag.size()))
{
str += flag.size();
ret = make_tuple(true,x.second);
break;
}
}
return ret;
}
ISO2022_JPChecker _jp = ISO2022_JPChecker();