-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathlbin_str.cc
150 lines (114 loc) · 3.27 KB
/
lbin_str.cc
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
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <string>
#include "xlualib.h"
using std::string;
using std::wstring;
//////////////////////////////////////////////////////////////////////////
static int LUA_C_hex2bin(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const bool errexit = lua_toboolean(ls, 2);
const bool errbreak = lua_toboolean(ls, 3);
const auto hs = hex2bin(s, l, nullptr, errexit, errbreak);
lua_pushlstring(ls, (const char*)hs.c_str(), hs.size());
return 1;
}
static int LUA_C_bin2hex(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const bool isup = lua_toboolean(ls, 2);
lua_pushstring(ls, bin2hex(s, l, isup).c_str());
return 1;
}
static int LUA_C_showbin(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const size_t flag = luaL_optinteger(ls, 2, 1);
const size_t prews = flag / 0x10;
Hex2showCode code = HC_ASCII;
if((flag & 1) == 1)
{
code = HC_ASCII;
}
else if((flag & 2) == 2)
{
code = HC_UNICODE;
}
else if((flag & 8) == 8)
{
code = HC_UTF8;
}
bool isup = true;
if((flag & 4) == 4)
{
isup = false;
}
lua_pushstring(ls, showbin(s, l, code, isup, prews).c_str());
return 1;
}
//////////////////////////////////////////////////////////////////////////
static int LUA_C_ws2s(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto ss(ws2s((const charucs2_t*)s, l / sizeof(charucs2_t)));
lua_pushlstring(ls, ss.c_str(), ss.size());
return 1;
}
static int LUA_C_s2ws(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto ws(s2ws(s, l));
lua_pushlstring(ls, (const char*)ws.c_str(), ws.size() * sizeof(charucs2_t));
return 1;
}
//////////////////////////////////////////////////////////////////////////
static int LUA_C_utf82ws(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto ws(utf82ws((pc_utf8)s, l));
lua_pushlstring(ls, (const char*)ws.c_str(), ws.size() * sizeof(charucs2_t));
return 1;
}
static int LUA_C_ws2utf8(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto u(ws2utf8((const charucs2_t*)s, l / sizeof(charucs2_t)));
lua_pushlstring(ls, (const char*)u.c_str(), u.size());
return 1;
}
static int LUA_C_utf82s(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto ss(ws2s(utf82ws((pc_utf8)s, l)));
lua_pushlstring(ls, (const char*)ss.c_str(), ss.size());
return 1;
}
static int LUA_C_s2utf8(lua_State* ls)
{
size_t l = 0;
const auto s = luaL_checklstring(ls, 1, &l);
const auto u(ws2utf8(s2ws(s, l)));
lua_pushlstring(ls, (const char*)u.c_str(), u.size());
return 1;
}
void register_hex_str(lua_State* ls)
{
lua_pop(ls, lua_gettop(ls));
lua_register(ls, "hex2bin", LUA_C_hex2bin);
lua_register(ls, "showbin", LUA_C_showbin);
lua_register(ls, "bin2hex", LUA_C_bin2hex);
lua_register(ls, "ws2s", LUA_C_ws2s);
lua_register(ls, "s2ws", LUA_C_s2ws);
lua_register(ls, "utf82ws", LUA_C_utf82ws);
lua_register(ls, "ws2utf8", LUA_C_ws2utf8);
lua_register(ls, "utf82s", LUA_C_utf82s);
lua_register(ls, "s2utf8", LUA_C_s2utf8);
lua_pop(ls, lua_gettop(ls));
}