@ -1,106 +0,0 @@ | |||||
// Single line comment. | |||||
/* Mutiline comment. | |||||
*/ | |||||
/* Enumeration Definition. */ | |||||
enum EnumName | |||||
{ | |||||
EN1, | |||||
EN2, | |||||
EN3, | |||||
} | |||||
enum EnumName16 | |||||
{ | |||||
EN16_a01, EN16_a02, EN16_a03, EN16_a04, EN16_a05, EN16_a06, EN16_a07, EN16_a08, | |||||
EN16_a11, EN16_a12, EN16_a13, EN16_a14, EN16_a15, EN16_a16, EN16_a17, EN16_a18, | |||||
EN16_a21, EN16_a22, EN16_a23, EN16_a24, EN16_a25, EN16_a26, EN16_a27, EN16_a28, | |||||
EN16_a31, EN16_a32, EN16_a33, EN16_a34, EN16_a35, EN16_a36, EN16_a37, EN16_a38, | |||||
EN16_a41, EN16_a42, EN16_a43, EN16_a44, EN16_a45, EN16_a46, EN16_a47, EN16_a48, | |||||
EN16_a51, EN16_a52, EN16_a53, EN16_a54, EN16_a55, EN16_a56, EN16_a57, EN16_a58, | |||||
EN16_a61, EN16_a62, EN16_a63, EN16_a64, EN16_a65, EN16_a66, EN16_a67, EN16_a68, | |||||
EN16_a71, EN16_a72, EN16_a73, EN16_a74, EN16_a75, EN16_a76, EN16_a77, EN16_a78, | |||||
EN16_b01, EN16_b02, EN16_b03, EN16_b04, EN16_b05, EN16_b06, EN16_b07, EN16_b08, | |||||
EN16_b11, EN16_b12, EN16_b13, EN16_b14, EN16_b15, EN16_b16, EN16_b17, EN16_b18, | |||||
EN16_b21, EN16_b22, EN16_b23, EN16_b24, EN16_b25, EN16_b26, EN16_b27, EN16_b28, | |||||
EN16_b31, EN16_b32, EN16_b33, EN16_b34, EN16_b35, EN16_b36, EN16_b37, EN16_b38, | |||||
EN16_b41, EN16_b42, EN16_b43, EN16_b44, EN16_b45, EN16_b46, EN16_b47, EN16_b48, | |||||
EN16_b51, EN16_b52, EN16_b53, EN16_b54, EN16_b55, EN16_b56, EN16_b57, EN16_b58, | |||||
EN16_b61, EN16_b62, EN16_b63, EN16_b64, EN16_b65, EN16_b66, EN16_b67, EN16_b68, | |||||
EN16_b71, EN16_b72, EN16_b73, EN16_b74, EN16_b75, EN16_b76, EN16_b77, EN16_b78, | |||||
EN16_c01, EN16_c02, EN16_c03, EN16_c04, EN16_c05, EN16_c06, EN16_c07, EN16_c08, | |||||
EN16_c11, EN16_c12, EN16_c13, EN16_c14, EN16_c15, EN16_c16, EN16_c17, EN16_c18, | |||||
EN16_c21, EN16_c22, EN16_c23, EN16_c24, EN16_c25, EN16_c26, EN16_c27, EN16_c28, | |||||
EN16_c31, EN16_c32, EN16_c33, EN16_c34, EN16_c35, EN16_c36, EN16_c37, EN16_c38, | |||||
EN16_c41, EN16_c42, EN16_c43, EN16_c44, EN16_c45, EN16_c46, EN16_c47, EN16_c48, | |||||
EN16_c51, EN16_c52, EN16_c53, EN16_c54, EN16_c55, EN16_c56, EN16_c57, EN16_c58, | |||||
EN16_c61, EN16_c62, EN16_c63, EN16_c64, EN16_c65, EN16_c66, EN16_c67, EN16_c68, | |||||
EN16_c71, EN16_c72, EN16_c73, EN16_c74, EN16_c75, EN16_c76, EN16_c77, EN16_c78, | |||||
EN16_d01, EN16_d02, EN16_d03, EN16_d04, EN16_d05, EN16_d06, EN16_d07, EN16_d08, | |||||
EN16_d11, EN16_d12, EN16_d13, EN16_d14, EN16_d15, EN16_d16, EN16_d17, EN16_d18, | |||||
EN16_d21, EN16_d22, EN16_d23, EN16_d24, EN16_d25, EN16_d26, EN16_d27, EN16_d28, | |||||
EN16_d31, EN16_d32, EN16_d33, EN16_d34, EN16_d35, EN16_d36, EN16_d37, EN16_d38, | |||||
EN16_d41, EN16_d42, EN16_d43, EN16_d44, EN16_d45, EN16_d46, EN16_d47, EN16_d48, | |||||
EN16_d51, EN16_d52, EN16_d53, EN16_d54, EN16_d55, EN16_d56, EN16_d57, EN16_d58, | |||||
EN16_d61, EN16_d62, EN16_d63, EN16_d64, EN16_d65, EN16_d66, EN16_d67, EN16_d68, | |||||
EN16_d71, EN16_d72, EN16_d73, EN16_d74, EN16_d75, EN16_d76, EN16_d77, EN16_d78, | |||||
Max, | |||||
} | |||||
struct StructType | |||||
{ | |||||
string aaa_; | |||||
int32 bbb_; | |||||
} | |||||
/* Structure Definition.*/ | |||||
struct StructBase | |||||
{ | |||||
/* Basic types */ | |||||
double double_; | |||||
float float_; | |||||
int64 int64_; | |||||
uint64 uint64_; | |||||
int32 int32_; | |||||
uint32 uint32_; | |||||
int16 int16_; | |||||
uint16 uint16_; | |||||
int8 int8_; | |||||
uint8 uint8_; | |||||
bool bool_; | |||||
// enum type. | |||||
EnumName enum_; | |||||
EnumName16 enum16_; | |||||
// struct type | |||||
StructType struct_; | |||||
// string type. | |||||
string string_; | |||||
// string type with explicit max length. | |||||
string(32) string1_; | |||||
// binary type. | |||||
binary bin_; | |||||
// binary type with explicit max length. | |||||
binary(32) bin1_; | |||||
/* array type. */ | |||||
double[] doubleArray_; | |||||
float[] floatArray_; | |||||
int64[] int64Array_; | |||||
uint64[] uint64Array_; | |||||
int32[] int32Array_; | |||||
uint32[] uint32Array_; | |||||
int16[] int16Array_; | |||||
uint16[] uint16Array_; | |||||
int8[] int8Array_; | |||||
uint8[] uint8Array_; | |||||
bool[] boolArray_; | |||||
string[] strArray_; | |||||
string(16)[8] strArray1_; | |||||
binary[] binArray_; | |||||
binary(32)[] bin1Array_; | |||||
EnumName[] enumArray_; | |||||
StructType[] structArray_; | |||||
} |
@ -0,0 +1,271 @@ | |||||
BA_ENDIAN_BIG = "ENDIAN_BIG" -- 大端 | |||||
BA_ENDIAN_LITTLE = "ENDIAN_LITTLE" -- 小端 | |||||
function ByteArray(endian) | |||||
---------------------------------------------------------------------- | |||||
-- private member variable | |||||
---------------------------------------------------------------------- | |||||
local mRadix = {[8]="%03o", [10]="%03u", [16]="%02X"} -- 进制 | |||||
local mEndian = endian or "" -- 大小端标识 | |||||
local mBuf = {} -- 二进制字节流 | |||||
local mPos = 1 -- 读写位置 | |||||
---------------------------------------------------------------------- | |||||
-- private method | |||||
---------------------------------------------------------------------- | |||||
-- 验证读写位置 | |||||
local function checkAvailable() | |||||
assert(#mBuf >= mPos, string.format("End of file was encountered. pos: %d, length: %d.", mPos, #mBuf)) | |||||
end | |||||
-- 获取字符码 | |||||
local function getLetterCode(fmt) | |||||
fmt = fmt or "" | |||||
if BA_ENDIAN_LITTLE == mEndian then | |||||
return "<"..fmt | |||||
elseif BA_ENDIAN_BIG == mEndianthen then | |||||
return ">"..fmt | |||||
else | |||||
return "="..fmt | |||||
end | |||||
end | |||||
-- 读单个字节 | |||||
local function readRawByte() | |||||
checkAvailable() | |||||
local rawByte = mBuf[mPos] | |||||
mPos = mPos + 1 | |||||
return rawByte | |||||
end | |||||
-- 写单个字节 | |||||
local function writeRawByte(rawByte) | |||||
if mPos > #mBuf + 1 then | |||||
for i=#mBuf + 1, mPos - 1 do | |||||
mBuf[i] = string.char(0) | |||||
end | |||||
end | |||||
mBuf[mPos] = rawByte | |||||
mPos = mPos + 1 | |||||
end | |||||
-- 读字节流 | |||||
local function readBuf(length) | |||||
checkAvailable() | |||||
local buf = table.concat(mBuf, "", mPos, mPos + length - 1) | |||||
mPos = mPos + length | |||||
return buf | |||||
end | |||||
-- 写字节流 | |||||
local function writeBuf(buf) | |||||
for i=1, #buf do | |||||
writeRawByte(buf:sub(i, i)) | |||||
end | |||||
end | |||||
-- 读字符串 | |||||
local function read_string_bytes(length) | |||||
if 0 == length then | |||||
return "" | |||||
end | |||||
local tmp, value = string.unpack(readBuf(length), getLetterCode("A"..length)) | |||||
return value | |||||
end | |||||
-- 写字符串 | |||||
local function write_string_bytes(value) | |||||
local buf = string.pack(getLetterCode("A"), value) | |||||
writeBuf(buf) | |||||
end | |||||
---------------------------------------------------------------------- | |||||
-- public method | |||||
---------------------------------------------------------------------- | |||||
local ba = {} | |||||
-- 设置大小端 | |||||
ba.setEndian = function(endian) | |||||
mEndian = endian or "" | |||||
end | |||||
-- 设置字节流 | |||||
ba.setBytes = function(buf) | |||||
if #mBuf > 0 then | |||||
return | |||||
end | |||||
writeBuf(buf) | |||||
mPos = 1 -- 这里必须重置读写位置为1,方能保证接下去的读操作正确 | |||||
end | |||||
-- 获取字节流 | |||||
ba.getBytes = function() | |||||
local bytes = {} | |||||
for i=1, #mBuf do | |||||
bytes[#bytes+1] = string.byte(mBuf[i]) | |||||
end | |||||
local packRes = string.pack(getLetterCode("b"..#bytes), unpack(bytes)) | |||||
return packRes | |||||
end | |||||
-- 获取字节流长度 | |||||
ba.getLength = function() | |||||
return #mBuf | |||||
end | |||||
-- 字节流转为字符串,radix-8,10,16 | |||||
ba.toString = function(radix, separator) | |||||
radix = radix or 16 | |||||
radix = mRadix[radix] or "%02X" | |||||
separator = separator or " " | |||||
local bytes = {} | |||||
for i=1, #mBuf do | |||||
bytes[i] = string.format(radix..separator, string.byte(mBuf[i])) | |||||
end | |||||
return table.concat(bytes) | |||||
end | |||||
---------------------------------------------------------------------- | |||||
-- 读16位整型 | |||||
ba.read_int16 = function() | |||||
local tmp, value = string.unpack(readBuf(2), getLetterCode("h")) | |||||
return value | |||||
end | |||||
-- 写16位整型 | |||||
ba.write_int16 = function(value) | |||||
local buf = string.pack(getLetterCode("h"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读16位无符号整型 | |||||
ba.read_uint16 = function() | |||||
local tmp, value = string.unpack(readBuf(2), getLetterCode("H")) | |||||
return value | |||||
end | |||||
-- 写16位无符号整型 | |||||
ba.write_uint16 = function(value) | |||||
local sstr = getLetterCode("H") | |||||
local buf = string.pack(sstr, value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读32位整型 | |||||
ba.read_int = function() | |||||
local tmp, value = string.unpack(readBuf(4), getLetterCode("i")) | |||||
return value | |||||
end | |||||
-- 写32位整型 | |||||
ba.write_int = function(value) | |||||
local buf = string.pack(getLetterCode("i"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读32位无符号整型 | |||||
ba.read_uint = function() | |||||
local tmp, value = string.unpack(readBuf(4), getLetterCode("I")) | |||||
return value | |||||
end | |||||
-- 写32位无符号整型 | |||||
ba.write_uint = function(value) | |||||
local buf = string.pack(getLetterCode("I"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读长整型 | |||||
ba.read_long = function() | |||||
local tmp, value = string.unpack(readBuf(4), getLetterCode("l")) | |||||
return value | |||||
end | |||||
-- 写长整型 | |||||
ba.write_long = function(value) | |||||
local buf = string.pack(getLetterCode("l"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读无符号长整型 | |||||
ba.read_ulong = function() | |||||
local tmp, value = string.unpack(readBuf(4), getLetterCode("L")) | |||||
return value | |||||
end | |||||
-- 写无符号长整型 | |||||
ba.write_ulong = function(value) | |||||
local buf = string.pack(getLetterCode("L"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读64位整型 | |||||
ba.read_int64 = function() | |||||
-- local tmp, value = string.unpack(readBuf(8), getLetterCode("m")) | |||||
-- return value | |||||
return read_string_bytes(8) | |||||
end | |||||
-- 写64位整型 | |||||
ba.write_int64 = function(value) | |||||
-- local buf = string.pack(getLetterCode("m"), value) | |||||
-- writeBuf(buf) | |||||
local buf = string.pack(getLetterCode("A"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读64位无符号整型 | |||||
ba.read_uint64 = function() | |||||
-- local tmp, value = string.unpack(readBuf(8), getLetterCode("M")) | |||||
-- return value | |||||
return read_string_bytes(8) | |||||
end | |||||
-- 写64位无符号整型 | |||||
ba.write_uint64 = function(value) | |||||
-- local buf = string.pack(getLetterCode("M"), value) | |||||
-- writeBuf(buf) | |||||
local buf = string.pack(getLetterCode("A"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读单精度浮点型 | |||||
ba.read_float = function() | |||||
local tmp, value = string.unpack(readBuf(4), getLetterCode("f")) | |||||
return value | |||||
end | |||||
-- 写单精度浮点型 | |||||
ba.write_float = function(value) | |||||
local buf = string.pack(getLetterCode("f"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读双精度浮点型 | |||||
ba.read_double = function() | |||||
local tmp, value = string.unpack(readBuf(8), getLetterCode("d")) | |||||
return value | |||||
end | |||||
-- 写双精度浮点型 | |||||
ba.write_double = function(value) | |||||
local buf = string.pack(getLetterCode("d"), value) | |||||
writeBuf(buf) | |||||
end | |||||
-- 读布尔型 | |||||
ba.read_bool = function() | |||||
return 1 == read_char() | |||||
end | |||||
-- 写布尔型 | |||||
ba.write_bool = function(value) | |||||
if value then | |||||
ba.write_char(1) | |||||
else | |||||
ba.write_char(0) | |||||
end | |||||
end | |||||
-- 读字符型 | |||||
ba.read_char = function() | |||||
local tmp, value = string.unpack(readRawByte(), "c") | |||||
return value | |||||
end | |||||
-- 写字符型 | |||||
ba.write_char = function(value) | |||||
writeRawByte(string.pack("c", value)) | |||||
end | |||||
-- 读单字节 | |||||
ba.read_uchar = function() | |||||
-- 方法1 | |||||
-- return string.byte(readRawByte()) | |||||
-- 方法2 | |||||
local tmp, value = string.unpack(readRawByte(), "b") | |||||
return value | |||||
end | |||||
-- 写单字节 | |||||
ba.write_uchar = function(value) | |||||
-- 方法1 | |||||
-- writeRawByte(string.char(value)) | |||||
-- 方法2 | |||||
writeRawByte(string.pack("b", value)) | |||||
end | |||||
-- 读字符串 | |||||
ba.read_string = function() | |||||
local length = ba.read_uint16() | |||||
return read_string_bytes(length) | |||||
end | |||||
-- 写字符串 | |||||
ba.write_string = function(value) | |||||
local buf = string.pack(getLetterCode("A"), value) | |||||
ba.write_uint16(#buf) | |||||
writeBuf(buf) | |||||
end | |||||
---------------------------------------------------------------------- | |||||
return ba | |||||
end | |||||
@ -1,562 +0,0 @@ | |||||
require("bintalk.types") | |||||
require("bintalk.reader") | |||||
require("bintalk.writer") | |||||
local EnumName = { | |||||
EN1 = 0, | |||||
EN2 = 1, | |||||
EN3 = 2, | |||||
} | |||||
EnumName = { _enum = EnumName } | |||||
BintalkTypes.EnumName = setmetatable(EnumName, BintalkTypes._enum_mt) | |||||
local EnumName16 = { | |||||
EN16_a01 = 0, | |||||
EN16_a02 = 1, | |||||
EN16_a03 = 2, | |||||
EN16_a04 = 3, | |||||
EN16_a05 = 4, | |||||
EN16_a06 = 5, | |||||
EN16_a07 = 6, | |||||
EN16_a08 = 7, | |||||
EN16_a11 = 8, | |||||
EN16_a12 = 9, | |||||
EN16_a13 = 10, | |||||
EN16_a14 = 11, | |||||
EN16_a15 = 12, | |||||
EN16_a16 = 13, | |||||
EN16_a17 = 14, | |||||
EN16_a18 = 15, | |||||
EN16_a21 = 16, | |||||
EN16_a22 = 17, | |||||
EN16_a23 = 18, | |||||
EN16_a24 = 19, | |||||
EN16_a25 = 20, | |||||
EN16_a26 = 21, | |||||
EN16_a27 = 22, | |||||
EN16_a28 = 23, | |||||
EN16_a31 = 24, | |||||
EN16_a32 = 25, | |||||
EN16_a33 = 26, | |||||
EN16_a34 = 27, | |||||
EN16_a35 = 28, | |||||
EN16_a36 = 29, | |||||
EN16_a37 = 30, | |||||
EN16_a38 = 31, | |||||
EN16_a41 = 32, | |||||
EN16_a42 = 33, | |||||
EN16_a43 = 34, | |||||
EN16_a44 = 35, | |||||
EN16_a45 = 36, | |||||
EN16_a46 = 37, | |||||
EN16_a47 = 38, | |||||
EN16_a48 = 39, | |||||
EN16_a51 = 40, | |||||
EN16_a52 = 41, | |||||
EN16_a53 = 42, | |||||
EN16_a54 = 43, | |||||
EN16_a55 = 44, | |||||
EN16_a56 = 45, | |||||
EN16_a57 = 46, | |||||
EN16_a58 = 47, | |||||
EN16_a61 = 48, | |||||
EN16_a62 = 49, | |||||
EN16_a63 = 50, | |||||
EN16_a64 = 51, | |||||
EN16_a65 = 52, | |||||
EN16_a66 = 53, | |||||
EN16_a67 = 54, | |||||
EN16_a68 = 55, | |||||
EN16_a71 = 56, | |||||
EN16_a72 = 57, | |||||
EN16_a73 = 58, | |||||
EN16_a74 = 59, | |||||
EN16_a75 = 60, | |||||
EN16_a76 = 61, | |||||
EN16_a77 = 62, | |||||
EN16_a78 = 63, | |||||
EN16_b01 = 64, | |||||
EN16_b02 = 65, | |||||
EN16_b03 = 66, | |||||
EN16_b04 = 67, | |||||
EN16_b05 = 68, | |||||
EN16_b06 = 69, | |||||
EN16_b07 = 70, | |||||
EN16_b08 = 71, | |||||
EN16_b11 = 72, | |||||
EN16_b12 = 73, | |||||
EN16_b13 = 74, | |||||
EN16_b14 = 75, | |||||
EN16_b15 = 76, | |||||
EN16_b16 = 77, | |||||
EN16_b17 = 78, | |||||
EN16_b18 = 79, | |||||
EN16_b21 = 80, | |||||
EN16_b22 = 81, | |||||
EN16_b23 = 82, | |||||
EN16_b24 = 83, | |||||
EN16_b25 = 84, | |||||
EN16_b26 = 85, | |||||
EN16_b27 = 86, | |||||
EN16_b28 = 87, | |||||
EN16_b31 = 88, | |||||
EN16_b32 = 89, | |||||
EN16_b33 = 90, | |||||
EN16_b34 = 91, | |||||
EN16_b35 = 92, | |||||
EN16_b36 = 93, | |||||
EN16_b37 = 94, | |||||
EN16_b38 = 95, | |||||
EN16_b41 = 96, | |||||
EN16_b42 = 97, | |||||
EN16_b43 = 98, | |||||
EN16_b44 = 99, | |||||
EN16_b45 = 100, | |||||
EN16_b46 = 101, | |||||
EN16_b47 = 102, | |||||
EN16_b48 = 103, | |||||
EN16_b51 = 104, | |||||
EN16_b52 = 105, | |||||
EN16_b53 = 106, | |||||
EN16_b54 = 107, | |||||
EN16_b55 = 108, | |||||
EN16_b56 = 109, | |||||
EN16_b57 = 110, | |||||
EN16_b58 = 111, | |||||
EN16_b61 = 112, | |||||
EN16_b62 = 113, | |||||
EN16_b63 = 114, | |||||
EN16_b64 = 115, | |||||
EN16_b65 = 116, | |||||
EN16_b66 = 117, | |||||
EN16_b67 = 118, | |||||
EN16_b68 = 119, | |||||
EN16_b71 = 120, | |||||
EN16_b72 = 121, | |||||
EN16_b73 = 122, | |||||
EN16_b74 = 123, | |||||
EN16_b75 = 124, | |||||
EN16_b76 = 125, | |||||
EN16_b77 = 126, | |||||
EN16_b78 = 127, | |||||
EN16_c01 = 128, | |||||
EN16_c02 = 129, | |||||
EN16_c03 = 130, | |||||
EN16_c04 = 131, | |||||
EN16_c05 = 132, | |||||
EN16_c06 = 133, | |||||
EN16_c07 = 134, | |||||
EN16_c08 = 135, | |||||
EN16_c11 = 136, | |||||
EN16_c12 = 137, | |||||
EN16_c13 = 138, | |||||
EN16_c14 = 139, | |||||
EN16_c15 = 140, | |||||
EN16_c16 = 141, | |||||
EN16_c17 = 142, | |||||
EN16_c18 = 143, | |||||
EN16_c21 = 144, | |||||
EN16_c22 = 145, | |||||
EN16_c23 = 146, | |||||
EN16_c24 = 147, | |||||
EN16_c25 = 148, | |||||
EN16_c26 = 149, | |||||
EN16_c27 = 150, | |||||
EN16_c28 = 151, | |||||
EN16_c31 = 152, | |||||
EN16_c32 = 153, | |||||
EN16_c33 = 154, | |||||
EN16_c34 = 155, | |||||
EN16_c35 = 156, | |||||
EN16_c36 = 157, | |||||
EN16_c37 = 158, | |||||
EN16_c38 = 159, | |||||
EN16_c41 = 160, | |||||
EN16_c42 = 161, | |||||
EN16_c43 = 162, | |||||
EN16_c44 = 163, | |||||
EN16_c45 = 164, | |||||
EN16_c46 = 165, | |||||
EN16_c47 = 166, | |||||
EN16_c48 = 167, | |||||
EN16_c51 = 168, | |||||
EN16_c52 = 169, | |||||
EN16_c53 = 170, | |||||
EN16_c54 = 171, | |||||
EN16_c55 = 172, | |||||
EN16_c56 = 173, | |||||
EN16_c57 = 174, | |||||
EN16_c58 = 175, | |||||
EN16_c61 = 176, | |||||
EN16_c62 = 177, | |||||
EN16_c63 = 178, | |||||
EN16_c64 = 179, | |||||
EN16_c65 = 180, | |||||
EN16_c66 = 181, | |||||
EN16_c67 = 182, | |||||
EN16_c68 = 183, | |||||
EN16_c71 = 184, | |||||
EN16_c72 = 185, | |||||
EN16_c73 = 186, | |||||
EN16_c74 = 187, | |||||
EN16_c75 = 188, | |||||
EN16_c76 = 189, | |||||
EN16_c77 = 190, | |||||
EN16_c78 = 191, | |||||
EN16_d01 = 192, | |||||
EN16_d02 = 193, | |||||
EN16_d03 = 194, | |||||
EN16_d04 = 195, | |||||
EN16_d05 = 196, | |||||
EN16_d06 = 197, | |||||
EN16_d07 = 198, | |||||
EN16_d08 = 199, | |||||
EN16_d11 = 200, | |||||
EN16_d12 = 201, | |||||
EN16_d13 = 202, | |||||
EN16_d14 = 203, | |||||
EN16_d15 = 204, | |||||
EN16_d16 = 205, | |||||
EN16_d17 = 206, | |||||
EN16_d18 = 207, | |||||
EN16_d21 = 208, | |||||
EN16_d22 = 209, | |||||
EN16_d23 = 210, | |||||
EN16_d24 = 211, | |||||
EN16_d25 = 212, | |||||
EN16_d26 = 213, | |||||
EN16_d27 = 214, | |||||
EN16_d28 = 215, | |||||
EN16_d31 = 216, | |||||
EN16_d32 = 217, | |||||
EN16_d33 = 218, | |||||
EN16_d34 = 219, | |||||
EN16_d35 = 220, | |||||
EN16_d36 = 221, | |||||
EN16_d37 = 222, | |||||
EN16_d38 = 223, | |||||
EN16_d41 = 224, | |||||
EN16_d42 = 225, | |||||
EN16_d43 = 226, | |||||
EN16_d44 = 227, | |||||
EN16_d45 = 228, | |||||
EN16_d46 = 229, | |||||
EN16_d47 = 230, | |||||
EN16_d48 = 231, | |||||
EN16_d51 = 232, | |||||
EN16_d52 = 233, | |||||
EN16_d53 = 234, | |||||
EN16_d54 = 235, | |||||
EN16_d55 = 236, | |||||
EN16_d56 = 237, | |||||
EN16_d57 = 238, | |||||
EN16_d58 = 239, | |||||
EN16_d61 = 240, | |||||
EN16_d62 = 241, | |||||
EN16_d63 = 242, | |||||
EN16_d64 = 243, | |||||
EN16_d65 = 244, | |||||
EN16_d66 = 245, | |||||
EN16_d67 = 246, | |||||
EN16_d68 = 247, | |||||
EN16_d71 = 248, | |||||
EN16_d72 = 249, | |||||
EN16_d73 = 250, | |||||
EN16_d74 = 251, | |||||
EN16_d75 = 252, | |||||
EN16_d76 = 253, | |||||
EN16_d77 = 254, | |||||
EN16_d78 = 255, | |||||
Max = 256, | |||||
} | |||||
EnumName16 = { _enum = EnumName16 } | |||||
BintalkTypes.EnumName16 = setmetatable(EnumName16, BintalkTypes._enum_mt) | |||||
local StructType = { | |||||
aaa_ = BintalkTypes.string(), | |||||
bbb_ = BintalkTypes.int32(), | |||||
} | |||||
BintalkTypes.StructType = function(v) | |||||
local _values = { | |||||
aaa_ = BintalkTypes.string(), | |||||
bbb_ = BintalkTypes.int32(), | |||||
} | |||||
local s = {_defaults = StructType, _values = _values} | |||||
setmetatable(s, BintalkTypes._struct_mt) | |||||
if not v then return s end | |||||
if v.aaa_ then | |||||
s.aaa_ = BintalkTypes.string(v.aaa_) | |||||
end | |||||
if v.bbb_ then | |||||
s.bbb_ = BintalkTypes.int32(v.bbb_) | |||||
end | |||||
return s | |||||
end | |||||
BintalkWriter.StructType = function(v, b) | |||||
BintalkWriter.string(v.aaa_, b) | |||||
BintalkWriter.int32(v.bbb_, b) | |||||
end | |||||
BintalkReader.StructType = function(b, p) | |||||
local v = BintalkTypes.StructType() | |||||
v.aaa_, p = BintalkReader.string(b, p, 0XFFFFFFFF) | |||||
v.bbb_, p = BintalkReader.int32(b, p, 0X0) | |||||
return v, p | |||||
end | |||||
local StructBase = { | |||||
double_ = BintalkTypes.double(), | |||||
float_ = BintalkTypes.float(), | |||||
int64_ = BintalkTypes.int64(), | |||||
uint64_ = BintalkTypes.uint64(), | |||||
int32_ = BintalkTypes.int32(), | |||||
uint32_ = BintalkTypes.uint32(), | |||||
int16_ = BintalkTypes.int16(), | |||||
uint16_ = BintalkTypes.uint16(), | |||||
int8_ = BintalkTypes.int8(), | |||||
uint8_ = BintalkTypes.uint8(), | |||||
bool_ = BintalkTypes.bool(), | |||||
enum_ = BintalkTypes.enum(), | |||||
enum16_ = BintalkTypes.enum16(), | |||||
struct_ = BintalkTypes.StructType(), | |||||
string_ = BintalkTypes.string(), | |||||
string1_ = BintalkTypes.string(), | |||||
bin_ = BintalkTypes.binary(), | |||||
bin1_ = BintalkTypes.binary(), | |||||
doubleArray_ = BintalkTypes.array(BintalkTypes.double), | |||||
floatArray_ = BintalkTypes.array(BintalkTypes.float), | |||||
int64Array_ = BintalkTypes.array(BintalkTypes.int64), | |||||
uint64Array_ = BintalkTypes.array(BintalkTypes.uint64), | |||||
int32Array_ = BintalkTypes.array(BintalkTypes.int32), | |||||
uint32Array_ = BintalkTypes.array(BintalkTypes.uint32), | |||||
int16Array_ = BintalkTypes.array(BintalkTypes.int16), | |||||
uint16Array_ = BintalkTypes.array(BintalkTypes.uint16), | |||||
int8Array_ = BintalkTypes.array(BintalkTypes.int8), | |||||
uint8Array_ = BintalkTypes.array(BintalkTypes.uint8), | |||||
boolArray_ = BintalkTypes.array(BintalkTypes.bool), | |||||
strArray_ = BintalkTypes.array(BintalkTypes.string), | |||||
strArray1_ = BintalkTypes.array(BintalkTypes.string), | |||||
binArray_ = BintalkTypes.array(BintalkTypes.binary), | |||||
bin1Array_ = BintalkTypes.array(BintalkTypes.binary), | |||||
enumArray_ = BintalkTypes.array(BintalkTypes.enum), | |||||
structArray_ = BintalkTypes.array(BintalkTypes.StructType), | |||||
} | |||||
BintalkTypes.StructBase = function(v) | |||||
local _values = { | |||||
double_ = BintalkTypes.double(), | |||||
float_ = BintalkTypes.float(), | |||||
int64_ = BintalkTypes.int64(), | |||||
uint64_ = BintalkTypes.uint64(), | |||||
int32_ = BintalkTypes.int32(), | |||||
uint32_ = BintalkTypes.uint32(), | |||||
int16_ = BintalkTypes.int16(), | |||||
uint16_ = BintalkTypes.uint16(), | |||||
int8_ = BintalkTypes.int8(), | |||||
uint8_ = BintalkTypes.uint8(), | |||||
bool_ = BintalkTypes.bool(), | |||||
enum_ = BintalkTypes.enum(), | |||||
enum16_ = BintalkTypes.enum16(), | |||||
struct_ = BintalkTypes.StructType(), | |||||
string_ = BintalkTypes.string(), | |||||
string1_ = BintalkTypes.string(), | |||||
bin_ = BintalkTypes.binary(), | |||||
bin1_ = BintalkTypes.binary(), | |||||
doubleArray_ = BintalkTypes.array(BintalkTypes.double), | |||||
floatArray_ = BintalkTypes.array(BintalkTypes.float), | |||||
int64Array_ = BintalkTypes.array(BintalkTypes.int64), | |||||
uint64Array_ = BintalkTypes.array(BintalkTypes.uint64), | |||||
int32Array_ = BintalkTypes.array(BintalkTypes.int32), | |||||
uint32Array_ = BintalkTypes.array(BintalkTypes.uint32), | |||||
int16Array_ = BintalkTypes.array(BintalkTypes.int16), | |||||
uint16Array_ = BintalkTypes.array(BintalkTypes.uint16), | |||||
int8Array_ = BintalkTypes.array(BintalkTypes.int8), | |||||
uint8Array_ = BintalkTypes.array(BintalkTypes.uint8), | |||||
boolArray_ = BintalkTypes.array(BintalkTypes.bool), | |||||
strArray_ = BintalkTypes.array(BintalkTypes.string), | |||||
strArray1_ = BintalkTypes.array(BintalkTypes.string), | |||||
binArray_ = BintalkTypes.array(BintalkTypes.binary), | |||||
bin1Array_ = BintalkTypes.array(BintalkTypes.binary), | |||||
enumArray_ = BintalkTypes.array(BintalkTypes.enum), | |||||
structArray_ = BintalkTypes.array(BintalkTypes.StructType), | |||||
} | |||||
local s = {_defaults = StructBase, _values = _values} | |||||
setmetatable(s, BintalkTypes._struct_mt) | |||||
if not v then return s end | |||||
if v.double_ then | |||||
s.double_ = BintalkTypes.double(v.double_) | |||||
end | |||||
if v.float_ then | |||||
s.float_ = BintalkTypes.float(v.float_) | |||||
end | |||||
if v.int64_ then | |||||
s.int64_ = BintalkTypes.int64(v.int64_) | |||||
end | |||||
if v.uint64_ then | |||||
s.uint64_ = BintalkTypes.uint64(v.uint64_) | |||||
end | |||||
if v.int32_ then | |||||
s.int32_ = BintalkTypes.int32(v.int32_) | |||||
end | |||||
if v.uint32_ then | |||||
s.uint32_ = BintalkTypes.uint32(v.uint32_) | |||||
end | |||||
if v.int16_ then | |||||
s.int16_ = BintalkTypes.int16(v.int16_) | |||||
end | |||||
if v.uint16_ then | |||||
s.uint16_ = BintalkTypes.uint16(v.uint16_) | |||||
end | |||||
if v.int8_ then | |||||
s.int8_ = BintalkTypes.int8(v.int8_) | |||||
end | |||||
if v.uint8_ then | |||||
s.uint8_ = BintalkTypes.uint8(v.uint8_) | |||||
end | |||||
if v.bool_ then | |||||
s.bool_ = BintalkTypes.bool(v.bool_) | |||||
end | |||||
if v.enum_ then | |||||
s.enum_ = BintalkTypes.enum(v.enum_) | |||||
end | |||||
if v.enum16_ then | |||||
s.enum16_ = BintalkTypes.enum16(v.enum16_) | |||||
end | |||||
if v.struct_ then | |||||
s.struct_ = BintalkTypes.StructType(v.struct_) | |||||
end | |||||
if v.string_ then | |||||
s.string_ = BintalkTypes.string(v.string_) | |||||
end | |||||
if v.string1_ then | |||||
s.string1_ = BintalkTypes.string(v.string1_) | |||||
end | |||||
if v.bin_ then | |||||
s.bin_ = BintalkTypes.binary(v.bin_) | |||||
end | |||||
if v.bin1_ then | |||||
s.bin1_ = BintalkTypes.binary(v.bin1_) | |||||
end | |||||
if v.doubleArray_ then | |||||
s.doubleArray_ = BintalkTypes.array(BintalkTypes.double, v.doubleArray_) | |||||
end | |||||
if v.floatArray_ then | |||||
s.floatArray_ = BintalkTypes.array(BintalkTypes.float, v.floatArray_) | |||||
end | |||||
if v.int64Array_ then | |||||
s.int64Array_ = BintalkTypes.array(BintalkTypes.int64, v.int64Array_) | |||||
end | |||||
if v.uint64Array_ then | |||||
s.uint64Array_ = BintalkTypes.array(BintalkTypes.uint64, v.uint64Array_) | |||||
end | |||||
if v.int32Array_ then | |||||
s.int32Array_ = BintalkTypes.array(BintalkTypes.int32, v.int32Array_) | |||||
end | |||||
if v.uint32Array_ then | |||||
s.uint32Array_ = BintalkTypes.array(BintalkTypes.uint32, v.uint32Array_) | |||||
end | |||||
if v.int16Array_ then | |||||
s.int16Array_ = BintalkTypes.array(BintalkTypes.int16, v.int16Array_) | |||||
end | |||||
if v.uint16Array_ then | |||||
s.uint16Array_ = BintalkTypes.array(BintalkTypes.uint16, v.uint16Array_) | |||||
end | |||||
if v.int8Array_ then | |||||
s.int8Array_ = BintalkTypes.array(BintalkTypes.int8, v.int8Array_) | |||||
end | |||||
if v.uint8Array_ then | |||||
s.uint8Array_ = BintalkTypes.array(BintalkTypes.uint8, v.uint8Array_) | |||||
end | |||||
if v.boolArray_ then | |||||
s.boolArray_ = BintalkTypes.array(BintalkTypes.bool, v.boolArray_) | |||||
end | |||||
if v.strArray_ then | |||||
s.strArray_ = BintalkTypes.array(BintalkTypes.string, v.strArray_) | |||||
end | |||||
if v.strArray1_ then | |||||
s.strArray1_ = BintalkTypes.array(BintalkTypes.string, v.strArray1_) | |||||
end | |||||
if v.binArray_ then | |||||
s.binArray_ = BintalkTypes.array(BintalkTypes.binary, v.binArray_) | |||||
end | |||||
if v.bin1Array_ then | |||||
s.bin1Array_ = BintalkTypes.array(BintalkTypes.binary, v.bin1Array_) | |||||
end | |||||
if v.enumArray_ then | |||||
s.enumArray_ = BintalkTypes.array(BintalkTypes.enum, v.enumArray_) | |||||
end | |||||
if v.structArray_ then | |||||
s.structArray_ = BintalkTypes.array(BintalkTypes.StructType, v.structArray_) | |||||
end | |||||
return s | |||||
end | |||||
BintalkWriter.StructBase = function(v, b) | |||||
BintalkWriter.double(v.double_, b) | |||||
BintalkWriter.float(v.float_, b) | |||||
BintalkWriter.int64(v.int64_, b) | |||||
BintalkWriter.uint64(v.uint64_, b) | |||||
BintalkWriter.int32(v.int32_, b) | |||||
BintalkWriter.uint32(v.uint32_, b) | |||||
BintalkWriter.int16(v.int16_, b) | |||||
BintalkWriter.uint16(v.uint16_, b) | |||||
BintalkWriter.int8(v.int8_, b) | |||||
BintalkWriter.uint8(v.uint8_, b) | |||||
BintalkWriter.bool(v.bool_, b) | |||||
BintalkWriter.enum(v.enum_, b) | |||||
BintalkWriter.enum16(v.enum16_, b) | |||||
BintalkWriter.StructType(v.struct_, b) | |||||
BintalkWriter.string(v.string_, b) | |||||
BintalkWriter.string(v.string1_, b) | |||||
BintalkWriter.binary(v.bin_, b) | |||||
BintalkWriter.binary(v.bin1_, b) | |||||
BintalkWriter.array(BintalkWriter.double, v.doubleArray_, b) | |||||
BintalkWriter.array(BintalkWriter.float, v.floatArray_, b) | |||||
BintalkWriter.array(BintalkWriter.int64, v.int64Array_, b) | |||||
BintalkWriter.array(BintalkWriter.uint64, v.uint64Array_, b) | |||||
BintalkWriter.array(BintalkWriter.int32, v.int32Array_, b) | |||||
BintalkWriter.array(BintalkWriter.uint32, v.uint32Array_, b) | |||||
BintalkWriter.array(BintalkWriter.int16, v.int16Array_, b) | |||||
BintalkWriter.array(BintalkWriter.uint16, v.uint16Array_, b) | |||||
BintalkWriter.array(BintalkWriter.int8, v.int8Array_, b) | |||||
BintalkWriter.array(BintalkWriter.uint8, v.uint8Array_, b) | |||||
BintalkWriter.array(BintalkWriter.bool, v.boolArray_, b) | |||||
BintalkWriter.array(BintalkWriter.string, v.strArray_, b) | |||||
BintalkWriter.array(BintalkWriter.string, v.strArray1_, b) | |||||
BintalkWriter.array(BintalkWriter.binary, v.binArray_, b) | |||||
BintalkWriter.array(BintalkWriter.binary, v.bin1Array_, b) | |||||
BintalkWriter.array(BintalkWriter.enum, v.enumArray_, b) | |||||
BintalkWriter.array(BintalkWriter.StructType, v.structArray_, b) | |||||
end | |||||
BintalkReader.StructBase = function(b, p) | |||||
local v = BintalkTypes.StructBase() | |||||
v.double_, p = BintalkReader.double(b, p, 0X0) | |||||
v.float_, p = BintalkReader.float(b, p, 0X0) | |||||
v.int64_, p = BintalkReader.int64(b, p, 0X0) | |||||
v.uint64_, p = BintalkReader.uint64(b, p, 0X0) | |||||
v.int32_, p = BintalkReader.int32(b, p, 0X0) | |||||
v.uint32_, p = BintalkReader.uint32(b, p, 0X0) | |||||
v.int16_, p = BintalkReader.int16(b, p, 0X0) | |||||
v.uint16_, p = BintalkReader.uint16(b, p, 0X0) | |||||
v.int8_, p = BintalkReader.int8(b, p, 0X0) | |||||
v.uint8_, p = BintalkReader.uint8(b, p, 0X0) | |||||
v.bool_, p = BintalkReader.bool(b, p, 0X0) | |||||
v.enum_, p = BintalkReader.enum(b, p, 0X2) | |||||
v.enum16_, p = BintalkReader.enum16(b, p, 0X100) | |||||
v.struct_, p = BintalkReader.StructType(b, p, 0X0) | |||||
v.string_, p = BintalkReader.string(b, p, 0XFFFFFFFF) | |||||
v.string1_, p = BintalkReader.string(b, p, 0X20) | |||||
v.bin_, p = BintalkReader.binary(b, p, 0XFFFFFFFF) | |||||
v.bin1_, p = BintalkReader.binary(b, p, 0X20) | |||||
v.doubleArray_, p = BintalkReader.array(b, p, BintalkReader.double, 0XFFFFFFFF, 0X0) | |||||
v.floatArray_, p = BintalkReader.array(b, p, BintalkReader.float, 0XFFFFFFFF, 0X0) | |||||
v.int64Array_, p = BintalkReader.array(b, p, BintalkReader.int64, 0XFFFFFFFF, 0X0) | |||||
v.uint64Array_, p = BintalkReader.array(b, p, BintalkReader.uint64, 0XFFFFFFFF, 0X0) | |||||
v.int32Array_, p = BintalkReader.array(b, p, BintalkReader.int32, 0XFFFFFFFF, 0X0) | |||||
v.uint32Array_, p = BintalkReader.array(b, p, BintalkReader.uint32, 0XFFFFFFFF, 0X0) | |||||
v.int16Array_, p = BintalkReader.array(b, p, BintalkReader.int16, 0XFFFFFFFF, 0X0) | |||||
v.uint16Array_, p = BintalkReader.array(b, p, BintalkReader.uint16, 0XFFFFFFFF, 0X0) | |||||
v.int8Array_, p = BintalkReader.array(b, p, BintalkReader.int8, 0XFFFFFFFF, 0X0) | |||||
v.uint8Array_, p = BintalkReader.array(b, p, BintalkReader.uint8, 0XFFFFFFFF, 0X0) | |||||
v.boolArray_, p = BintalkReader.array(b, p, BintalkReader.bool, 0XFFFFFFFF, 0X0) | |||||
v.strArray_, p = BintalkReader.array(b, p, BintalkReader.string, 0XFFFFFFFF, 0XFFFFFFFF) | |||||
v.strArray1_, p = BintalkReader.array(b, p, BintalkReader.string, 0X8, 0X10) | |||||
v.binArray_, p = BintalkReader.array(b, p, BintalkReader.binary, 0XFFFFFFFF, 0XFFFFFFFF) | |||||
v.bin1Array_, p = BintalkReader.array(b, p, BintalkReader.binary, 0XFFFFFFFF, 0X20) | |||||
v.enumArray_, p = BintalkReader.array(b, p, BintalkReader.enum, 0XFFFFFFFF, 0X2) | |||||
v.structArray_, p = BintalkReader.array(b, p, BintalkReader.StructType, 0XFFFFFFFF, 0X0) | |||||
return v, p | |||||
end |
@ -1,161 +0,0 @@ | |||||
#include "Options.h" | |||||
#include "Context.h" | |||||
#include "CodeFile.h" | |||||
#include "CodeGenerator.h" | |||||
DECLARE_CG(LUAGenerator, lua); | |||||
static void generateEnum(CodeFile& f, Enum* e) | |||||
{ | |||||
const char* name = e->getNameC(); | |||||
f.output("local %s = {", name); | |||||
f.indent(); | |||||
for (size_t i = 0; i < e->items_.size(); i++) | |||||
f.output("%s = %d,", e->items_[i].c_str(), i); | |||||
f.recover(); | |||||
f.output("}"); | |||||
f.output("%s = { _enum = %s }", name, name); | |||||
f.output("BintalkTypes.%s = setmetatable(%s, BintalkTypes._enum_mt)", name, name); | |||||
} | |||||
static const char* getFieldTypeName(Field& f) | |||||
{ | |||||
switch (f.type_) | |||||
{ | |||||
case Field::FT_INT64: return "int64"; | |||||
case Field::FT_UINT64: return "uint64"; | |||||
case Field::FT_DOUBLE: return "double"; | |||||
case Field::FT_FLOAT: return "float"; | |||||
case Field::FT_INT32: return "int32"; | |||||
case Field::FT_UINT32: return "uint32"; | |||||
case Field::FT_INT16: return "int16"; | |||||
case Field::FT_UINT16: return "uint16"; | |||||
case Field::FT_INT8: return "int8"; | |||||
case Field::FT_UINT8: return "uint8"; | |||||
case Field::FT_BOOL: return "bool"; | |||||
case Field::FT_STRING: return "string"; | |||||
case Field::FT_USER: return f.userType_->getNameC(); | |||||
case Field::FT_ENUM: return f.userType_->getEnum()->isEnum16()?"enum16":"enum"; | |||||
case Field::FT_BINARY: return "binary"; | |||||
} | |||||
return ""; | |||||
} | |||||
static void generateFieldDefaults(CodeFile& f, FieldContainer* fc) | |||||
{ | |||||
for (size_t i = 0; i < fc->fields_.size(); i++) | |||||
{ | |||||
Field& field = fc->fields_[i]; | |||||
const char* name = field.getNameC(); | |||||
const char* type = getFieldTypeName(field); | |||||
if (field.isArray()) | |||||
f.output("%s = BintalkTypes.array(BintalkTypes.%s),", name, type); | |||||
else | |||||
f.output("%s = BintalkTypes.%s(),", name, type); | |||||
} | |||||
} | |||||
static void generateFieldInitCode(CodeFile& f, FieldContainer* fc) | |||||
{ | |||||
for (size_t i = 0; i < fc->fields_.size(); i++) | |||||
{ | |||||
Field& field = fc->fields_[i]; | |||||
const char* name = field.getNameC(); | |||||
const char* type = getFieldTypeName(field); | |||||
f.output("if v.%s then", name); | |||||
f.indent(); | |||||
if (field.isArray()) | |||||
f.output("s.%s = BintalkTypes.array(BintalkTypes.%s, v.%s)", name, type, name); | |||||
else | |||||
f.output("s.%s = BintalkTypes.%s(v.%s)", name, type, name); | |||||
f.recover(); | |||||
f.output("end"); | |||||
} | |||||
} | |||||
static void generateFieldContainerSCode(CodeFile& f, FieldContainer* fc) | |||||
{ | |||||
for (size_t i = 0; i < fc->fields_.size(); i++) | |||||
{ | |||||
Field& field = fc->fields_[i]; | |||||
if (field.isArray()) | |||||
f.output("BintalkWriter.array(BintalkWriter.%s, v.%s, b)", getFieldTypeName(field), field.getNameC()); | |||||
else | |||||
f.output("BintalkWriter.%s(v.%s, b)", getFieldTypeName(field), field.getNameC()); | |||||
} | |||||
} | |||||
static void generateFieldContainerDSCode(CodeFile& f, FieldContainer* fc) | |||||
{ | |||||
for (size_t i = 0; i < fc->fields_.size(); i++) | |||||
{ | |||||
Field& field = fc->fields_[i]; | |||||
if (field.isArray()) | |||||
f.output("v.%s, p = BintalkReader.array(b, p, BintalkReader.%s, 0X%X, 0X%X)", field.getNameC(), getFieldTypeName(field), field.maxArray_, field.maxValue_); | |||||
else | |||||
f.output("v.%s, p = BintalkReader.%s(b, p, 0X%X)", field.getNameC(), getFieldTypeName(field), field.maxValue_); | |||||
} | |||||
} | |||||
static void generateStruct(CodeFile& f, Struct* s) | |||||
{ | |||||
const char* name = s->getNameC(); | |||||
f.output("local %s = {", name); | |||||
f.indent(); | |||||
generateFieldDefaults(f, s); | |||||
f.recover(); | |||||
f.output("}"); | |||||
f.output("BintalkTypes.%s = function(v)", name); | |||||
f.indent(); | |||||
f.output("local _values = {"); | |||||
f.indent(); | |||||
generateFieldDefaults(f, s); | |||||
f.recover(); | |||||
f.output("}"); | |||||
f.output("local s = {_defaults = %s, _values = _values}", name); | |||||
f.output("setmetatable(s, BintalkTypes._struct_mt)"); | |||||
f.output("if not v then return s end"); | |||||
generateFieldInitCode(f, s); | |||||
f.output("return s"); | |||||
f.recover(); | |||||
f.output("end"); | |||||
f.output("BintalkWriter.%s = function(v, b)", s->getNameC()); | |||||
f.indent(); | |||||
generateFieldContainerSCode(f, s); | |||||
f.recover(); | |||||
f.output("end"); | |||||
f.output("BintalkReader.%s = function(b, p)", s->getNameC()); | |||||
f.indent(); | |||||
f.output("local v = BintalkTypes.%s()", s->getNameC()); | |||||
generateFieldContainerDSCode(f, s); | |||||
f.output("return v, p"); | |||||
f.recover(); | |||||
f.output("end"); | |||||
} | |||||
void LUAGenerator::generate() | |||||
{ | |||||
std::string fn = gOptions.output_ + gOptions.inputFS_ + ".lua"; | |||||
CodeFile f(fn); | |||||
f.output("require(\"bintalk.types\")"); | |||||
f.output("require(\"bintalk.reader\")"); | |||||
f.output("require(\"bintalk.writer\")"); | |||||
for (std::set<std::string>::iterator iter = gContext.imported_.begin(); | |||||
iter != gContext.imported_.end(); ++iter) | |||||
{ | |||||
std::string incFilename = *iter; | |||||
incFilename = incFilename.substr(0, incFilename.find('.')); | |||||
f.output("require(\"btk_gen.%s\")", incFilename.c_str()); | |||||
} | |||||
for (size_t i = 0; i < gContext.definitions_.size(); i++) | |||||
{ | |||||
Definition* definition = gContext.definitions_[i]; | |||||
if (definition->file_ != gOptions.inputFN_) | |||||
continue; | |||||
if (definition->getEnum()) | |||||
generateEnum(f, definition->getEnum()); | |||||
else if (definition->getStruct()) | |||||
generateStruct(f, definition->getStruct()); | |||||
} | |||||
} |
@ -0,0 +1,50 @@ | |||||
-module(gLuaField). | |||||
-compile([export_all, nowarn_export_all]). | |||||
-define(SimpleList, [ | |||||
<<"int8">> | |||||
, <<"uint8">> | |||||
, <<"int16">> | |||||
, <<"uint16">> | |||||
, <<"int32">> | |||||
, <<"uint32">> | |||||
, <<"int64">> | |||||
, <<"uint64">> | |||||
, <<"float">> | |||||
, <<"double">> | |||||
]). | |||||
-define(TypeValue, [ | |||||
{<<"bool">>, <<"bool">>} | |||||
, {<<"int8">>, <<"sbyte">>} | |||||
, {<<"uint8">>, <<"byte">>} | |||||
, {<<"int16">>, <<"short">>} | |||||
, {<<"uint16">>, <<"ushort">>} | |||||
, {<<"int32">>, <<"int">>} | |||||
, {<<"uint32">>, <<"uint">>} | |||||
, {<<"int64">>, <<"long">>} | |||||
, {<<"uint64">>, <<"ulong">>} | |||||
, {<<"float">>, <<"float">>} | |||||
, {<<"double">>, <<"double">>} | |||||
, {<<"string">>, <<"string">>} | |||||
]). | |||||
builtRecStr({TypeStr, NameStr}) -> | |||||
case lists:keyfind(TypeStr, 1, ?TypeValue) of | |||||
{TypeStr, CSTypeStr} -> | |||||
<<"\t\tpublic ", CSTypeStr/binary, " ", NameStr/binary, ";\n">>; | |||||
_ -> | |||||
case TypeStr of | |||||
<<"list[", LeftStr/binary>> -> | |||||
[SubTypeStr | _] = re:split(LeftStr, <<"\\]">>, [{return, binary}]), | |||||
case lists:keyfind(SubTypeStr, 1, ?TypeValue) of | |||||
{SubTypeStr, SubCSTypeStr} -> | |||||
<<"\t\tpublic List<", SubCSTypeStr/binary, "> ", NameStr/binary, ";\n">>; | |||||
_ -> | |||||
<<"\t\tpublic List<", SubTypeStr/binary, "> ", NameStr/binary, ";\n">> | |||||
end; | |||||
_ -> | |||||
<<"\t\tpublic ", TypeStr/binary, " ", NameStr/binary, ";\n">> | |||||
end | |||||
end. |
@ -0,0 +1,397 @@ | |||||
%% Author: NoteBook | |||||
%% Created: 2009-9-18 | |||||
%% Description: TODO: Add description to gen_protocal_charp | |||||
-module(gLuaGen). | |||||
%% | |||||
%% Include files | |||||
%% | |||||
%% | |||||
%% Exported Functions | |||||
%% | |||||
-export([start/0]). | |||||
-export([test/0]). | |||||
%% | |||||
%% API Functions | |||||
%% | |||||
start() -> | |||||
StructList = protocol_def:get_struct_def(), | |||||
TypeList = gen_common:get_type(), | |||||
FileStr = make_protocal(StructList, "", TypeList), | |||||
%%根据前端需求更改 原:file:write_file("NetPacket.lua", FileStr), | |||||
%% file:write_file("NetPacket.lua", lists:concat(["return {", FileStr, "}"])), | |||||
file:write_file("NetPacket.lua", FileStr), | |||||
EnumStr = make_protocal_enum(protocol_def:get_enum_def(), ""), | |||||
ConstStr = make_protocal_const(protocol_def:get_version()), | |||||
file:write_file("NetEnumDef.lua", EnumStr ++ "\n" ++ ConstStr), | |||||
MsgTypeStr = make_protocal_msg_type(StructList, "", 1), | |||||
file:write_file("NetMsgType.lua", MsgTypeStr). | |||||
%% | |||||
%% Local Functions | |||||
%% | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成包含文件%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
%% make_include() -> | |||||
%% "using System; | |||||
%% using System.Collections;". | |||||
%% "#pragma once | |||||
%% #include\"ByteArray.h\" | |||||
%% #include\"BaseType.h\" | |||||
%% #include\"INetPacket.h\" | |||||
%% #include\"NetMsgType.h\" | |||||
%% #include<string> | |||||
%% #include<vector> | |||||
%% ". | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成函数的方法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal([], StructStr, _TypeList) -> | |||||
StructStr; | |||||
make_protocal([Struct | Structs], StructStr, TypeList) -> | |||||
[StructName | NewStructList] = Struct, | |||||
VariableStr = make_protocal_Variable(NewStructList, "", TypeList), | |||||
EncodeStr = make_protocal_encode(NewStructList, "", TypeList), | |||||
DecodeStr = make_protocal_decode(NewStructList, "", TypeList), | |||||
BuildStr = make_protocal_build(StructName), | |||||
CreateStr = make_protocal_create(StructName), | |||||
StructStr1 = StructStr ++ "\nfunction " ++ atom_to_list(StructName) ++ " ()" ++ | |||||
"\n" ++ | |||||
" local tb = {}\n" ++ | |||||
make_getmsgid(StructName) ++ | |||||
%% " public int getMsgID()\n" ++ | |||||
%% " {\n" ++ | |||||
%% " return NetMsgType.msg_" ++ atom_to_list(StructName) ++ ";\n" ++ | |||||
%% " }\n" ++ | |||||
VariableStr ++ EncodeStr ++ DecodeStr ++ BuildStr ++ CreateStr ++ "\nend\n", | |||||
make_protocal(Structs, StructStr1, TypeList). | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成变量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal_Variable([], VariableStr, _TypeList) -> | |||||
VariableStr; | |||||
make_protocal_Variable([{Type, Name} | Vars], VariableStr, TypeList) -> | |||||
VariableStr1 = | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{_Type1, base_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = 0\n"; | |||||
{_Type1, string_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = \"\"\n"; | |||||
{_Type, enum_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = 0\n"; | |||||
_ -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = {}\n" | |||||
end, | |||||
make_protocal_Variable(Vars, VariableStr1, TypeList); | |||||
make_protocal_Variable([{Type, Name, DefaultValue} | Vars], VariableStr, TypeList) | |||||
when Type =/= array -> | |||||
VariableStr1 = | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{_Type1, base_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = " ++ get_default_value(Type, DefaultValue) ++ "\n"; | |||||
{_Type1, string_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = " ++ get_default_value(Type, DefaultValue) ++ ";\n"; | |||||
{_Type, enum_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = 0\n"; | |||||
_ -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = {}\n" | |||||
end, | |||||
make_protocal_Variable(Vars, VariableStr1, TypeList); | |||||
make_protocal_Variable([{array, Type, Name} | Vars], VariableStr, TypeList) -> | |||||
VariableStr1 = | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{_Type1, base_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = {}\n"; | |||||
{_Type1, string_type} -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = {}\n"; | |||||
{_Type, enum_type} -> | |||||
VariableStr ++ " tb." ++ atom_to_list(Name) ++ " = {}\n"; | |||||
_ -> | |||||
VariableStr ++ " tb." ++ get_csharp_Var(Name) ++ " = {}\n" | |||||
end, | |||||
make_protocal_Variable(Vars, VariableStr1, TypeList). | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal_build(StructName) -> | |||||
"\n tb.build = function(byteArray)\n" ++ | |||||
" byteArray.write_uint16(NetMsgType[\"msg_" ++ atom_to_list(StructName) ++ "\"])\n" ++ | |||||
" return tb.encode(byteArray)\n" ++ | |||||
" end\n". | |||||
make_protocal_create(_StructName)-> | |||||
"\n return tb\n". | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成encode%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
%% byteArray.write_uint16(account.size()); | |||||
%% for(int i=0; i<account.size();i++) | |||||
%% { | |||||
%% byteArray.write_string(account[i]); | |||||
%% } | |||||
make_protocal_encode([], EncodeStr, _TypeList) -> | |||||
"\n tb.encode = function(byteArray)\n" | |||||
++ EncodeStr ++ " return byteArray\n" | |||||
++ " end\n\n"; | |||||
make_protocal_encode([Struct | Vars], EncodeStr, TypeList) -> | |||||
EncodeStr1 = EncodeStr ++ make_protocal_encode_item(Struct, TypeList), | |||||
make_protocal_encode(Vars, EncodeStr1, TypeList). | |||||
%% 生成decode中的数组 | |||||
make_protocal_encode_item({Type, Name}, TypeList) -> | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{Type, base_type} -> | |||||
" \tbyteArray.write_"++ atom_to_list(Type) ++"(tb." ++ get_csharp_Var(Name) ++ ")\n"; | |||||
{Type, string_type} -> | |||||
" \tbyteArray.write_"++ atom_to_list(Type) ++"(tb." ++ get_csharp_Var(Name) ++ ")\n"; | |||||
{_Type, enum_type} -> | |||||
make_protocal_encode_item({int, Name}, TypeList); | |||||
_ -> | |||||
" tb." ++ get_csharp_Var(Name) ++ ".encode(byteArray);\n" | |||||
%%" " ++ get_csharp_Var(Name) ++ ".encode(byteArray)\n\n" | |||||
end; | |||||
make_protocal_encode_item({Type, Name, _DefaultValue}, TypeList) | |||||
when Type /= array-> | |||||
make_protocal_encode_item({Type, Name}, TypeList); | |||||
make_protocal_encode_item({array, Type, Name}, TypeList) -> | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{Type1, base_type} -> | |||||
make_protocal_encode_item_base_type(Name, Type1); | |||||
{Type1, string_type} -> | |||||
make_protocal_encode_item_base_type(Name, Type1); | |||||
{_Type, enum_type} -> | |||||
make_protocal_encode_item({array, int, Name}, TypeList); | |||||
_ -> | |||||
NameStr = get_csharp_Var(Name), | |||||
" byteArray.write_uint16(#(tb." ++ NameStr ++ "))\n" ++ | |||||
" for k, v in pairs(tb." ++ NameStr ++ ") do\n" ++ | |||||
" byteArray = v.encode(byteArray)\n" ++ | |||||
" end\n" | |||||
end. | |||||
make_protocal_encode_item_base_type(Name, Type) -> | |||||
NameStr = get_csharp_Var(Name), | |||||
TypeStr = get_csharp_type(Type), | |||||
" byteArray.write_uint16(#(tb." ++ NameStr ++ "))\n" ++ | |||||
" for k, v in pairs (tb." ++ NameStr ++ ") do\n" ++ | |||||
" byteArray.write_" ++ TypeStr ++ "(v)\n" ++ | |||||
" end\n". | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成decode%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal_decode([], DecodeStr, _TypeList) -> | |||||
" tb.decode = function(byteArray)\n" ++ DecodeStr ++ " end\n"; | |||||
make_protocal_decode([Struct | Vars], DecodeStr, TypeList) -> | |||||
DecodeStr1 = DecodeStr ++ make_protocal_decode_item(Struct, TypeList), | |||||
make_protocal_decode(Vars, DecodeStr1, TypeList). | |||||
make_protocal_decode_item({Type, Name}, TypeList) -> | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{Type1, base_type} -> | |||||
" tb." ++ get_csharp_Var(Name) ++ " = byteArray.read_"++ atom_to_list(Type1) ++"();\n"; | |||||
{Type1, string_type} -> | |||||
" tb." ++ get_csharp_Var(Name) ++ " = byteArray.read_"++ atom_to_list(Type1) ++"();\n"; | |||||
{_Type, enum_type} -> | |||||
make_protocal_decode_item({int, Name}, TypeList); | |||||
_ -> | |||||
TypeString = get_csharp_type(Type), | |||||
" tb." ++ get_csharp_Var(Name) ++ " = " ++ TypeString ++ "();\n" ++ | |||||
" tb." ++ get_csharp_Var(Name) ++ ".decode(byteArray);\n" | |||||
%%" " ++ get_csharp_Var(Name) ++ ".decode(byteArray);\n" | |||||
end; | |||||
make_protocal_decode_item({Type, Name, _DefaultValue}, TypeList) | |||||
when Type /= array-> | |||||
make_protocal_decode_item({Type, Name}, TypeList); | |||||
make_protocal_decode_item({array, Type, Name}, TypeList) -> | |||||
case lists:keyfind(Type, 1, TypeList) of | |||||
{Type1, base_type} -> | |||||
make_protocal_encode_item_decode_type(Name, Type1); | |||||
{Type1, string_type} -> | |||||
make_protocal_encode_item_decode_type(Name, Type1); | |||||
{_Type, enum_type} -> | |||||
make_protocal_decode_item({array, int, Name}, TypeList); | |||||
_ -> | |||||
TypeString = get_csharp_type(Type), | |||||
NameStr = get_csharp_Var(Name), | |||||
CountString = "countOf" ++ NameStr, | |||||
_ArrayString = "arrayOf" ++ NameStr, | |||||
" local " ++ CountString ++ " = byteArray.read_uint16()\n" ++ | |||||
" tb."++NameStr++" = {}\n" ++ | |||||
" for i = 1, " ++ CountString ++ " do\n" ++ | |||||
" local temp = " ++ TypeString ++ "()\n" ++ | |||||
" temp.decode(byteArray)\n" ++ | |||||
" table.insert(tb."++NameStr++", temp)\n" ++ | |||||
" end\n" | |||||
end. | |||||
make_protocal_encode_item_decode_type(Name, Type) -> | |||||
NameStr = get_csharp_Var(Name), | |||||
TypeStr = atom_to_list(Type), | |||||
CountString = "countOf" ++ NameStr, | |||||
" local " ++ CountString ++ " = byteArray.read_uint16()\n" ++ | |||||
" tb."++NameStr++" = {}\n" ++ | |||||
" for i = 1, " ++ CountString ++ " do\n" ++ | |||||
" table.insert(tb." ++ NameStr ++ ", byteArray.read_" ++ TypeStr ++ "())\n" ++ | |||||
" end\n". | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成网络类型%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal_msg_type([], MsgTypeStr, _Index) -> | |||||
"NetMsgType = \n" ++ | |||||
"{\n" ++ | |||||
MsgTypeStr ++ | |||||
"}"; | |||||
make_protocal_msg_type([Struct|Structs], MsgTypeStr, Index) -> | |||||
[StructName | _NewStructList] = Struct, | |||||
case Structs == [] of | |||||
true -> | |||||
make_protocal_msg_type(Structs, MsgTypeStr ++ " [\"msg_" ++ atom_to_list(StructName) ++ "\"] = "++integer_to_list(Index)++"\n", Index+1); | |||||
false -> | |||||
make_protocal_msg_type(Structs, MsgTypeStr ++ " [\"msg_" ++ atom_to_list(StructName) ++ "\"] = "++integer_to_list(Index)++",\n", Index+1) | |||||
end. | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成枚举类型%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
make_protocal_const(Ver) -> | |||||
"function get_proto_version() | |||||
return "++integer_to_list(Ver)++"; | |||||
end\n". | |||||
make_protocal_enum([], EnumStr) -> | |||||
EnumStr; | |||||
make_protocal_enum([Enum | Enums], EnumStr) -> | |||||
{EnumName , EnumItems} = Enum, | |||||
EnumStr1 = EnumStr ++ | |||||
string:to_lower(atom_to_list(EnumName)) ++ " = \n{\n" ++ | |||||
make_protocal_enum_item(EnumItems, 1, "") ++ "}\n", | |||||
make_protocal_enum(Enums, EnumStr1). | |||||
make_protocal_enum_item([EnumItem | []], Index, EnumItemStr) -> | |||||
EnumItemStr ++ " [\"" ++ atom_to_list(EnumItem) ++ "\"] = "++integer_to_list(Index)++"\n"; | |||||
make_protocal_enum_item([EnumItem | EnumItems], Index, EnumItemStr) -> | |||||
EnumItemStr1 = EnumItemStr ++ " [\"" ++ atom_to_list(EnumItem) ++ "\"]= "++integer_to_list(Index)++",\n", | |||||
make_protocal_enum_item(EnumItems, Index + 1, EnumItemStr1). | |||||
get_csharp_Var(Type)-> | |||||
TypeString = atom_to_list(Type), | |||||
case lists:keyfind(TypeString, 1, get_keyword_mapping()) of | |||||
{TypeString, CSharpTypeString}-> | |||||
CSharpTypeString; | |||||
_ -> | |||||
TypeString | |||||
end. | |||||
get_csharp_type(Type) -> | |||||
TypeString = atom_to_list(Type), | |||||
case lists:keyfind(TypeString, 1, get_cshapr_type_mapping()) of | |||||
{TypeString, CSharpTypeString}-> | |||||
CSharpTypeString; | |||||
_ -> | |||||
TypeString | |||||
end. | |||||
get_cshapr_type_mapping()-> | |||||
[ | |||||
{"uint", "UInt"}, | |||||
{"int16", "Int16"}, | |||||
{"uint16", "UInt16"}, | |||||
{"int64", "Int64"}, | |||||
{"uint64", "uint64"}, | |||||
{"uchar", "char"} | |||||
]. | |||||
get_keyword_mapping() -> | |||||
[ | |||||
{"lock", "Lock"}, | |||||
{"params", "Params"} | |||||
]. | |||||
make_getmsgid(StructName)-> | |||||
" tb.getMsgID = function()\n" ++ | |||||
" " ++ | |||||
" return NetMsgType[\"msg_" ++ atom_to_list(StructName) ++ "\"]\n" ++ | |||||
" end\n". | |||||
get_default_value(Type, DefaultValue) | |||||
when (Type == int orelse | |||||
Type == uint orelse | |||||
Type == uint64 orelse | |||||
Type == uint16 orelse | |||||
Type == int64 orelse | |||||
Type == short orelse | |||||
Type == int16) | |||||
andalso is_integer(DefaultValue)-> | |||||
integer_to_list(DefaultValue); | |||||
get_default_value(Type, DefaultValue) | |||||
when (Type == float orelse | |||||
Type == long orelse | |||||
Type == double orelse | |||||
Type == uint16 orelse | |||||
Type == int64 orelse | |||||
Type == int16) | |||||
andalso is_float(DefaultValue)-> | |||||
float_to_list(DefaultValue); | |||||
get_default_value(char, DefaultValue) | |||||
when is_list(DefaultValue)-> | |||||
"'" ++ DefaultValue ++ "'"; | |||||
get_default_value(string, DefaultValue) | |||||
when is_atom(DefaultValue)-> | |||||
get_default_value(string, atom_to_list(DefaultValue)); | |||||
get_default_value(string, DefaultValue) | |||||
when is_list(DefaultValue)-> | |||||
"\"" ++ DefaultValue ++ "\"". | |||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%测试函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |||||
test() -> | |||||
%% test_make_protocal_encode_item(), | |||||
%% test_make_protocal_decode_item(), | |||||
%% test_make_protocal_encode(), | |||||
%% test_make_protocal_decode(). | |||||
start(). | |||||
%% test_make_protocal_encode_item() -> | |||||
%% "\t\tbyteArray.write_uint16(result.size());\n\t\tfor(int i=0; i<result.size();i++)\n\t{\n\t\t\tresult[i].encode(byteArray);\n\t}\n" | |||||
%% = make_protocal_encode_item({array, notify_login_result, result}, gen_common:get_type()), | |||||
%% "\t\tbyteArray.write_uint16(account.size());\n\t\tfor(int i=0; i<account.size();i++)\n\t{\n\t\t\tbyteArray.write_string(account[i]);\n\t}\n" | |||||
%% = make_protocal_encode_item({array, string, account}, gen_common:get_type()), | |||||
%% "\t\tbyteArray.write_uint16(account.size());\n\t\tfor(int i=0; i<account.size();i++)\n\t{\n\t\t\tbyteArray.write_int(account[i]);\n\t}\n" | |||||
%% = make_protocal_encode_item({array, login_result, account}, gen_common:get_type()), | |||||
%% "\t\tbyteArray.write_string(account);\n" = make_protocal_encode_item({string, account}, gen_common:get_type()), | |||||
%% "\t\tbyteArray.write_int(account);\n" = make_protocal_encode_item({login_result, account}, gen_common:get_type()), | |||||
%% "\t\taccount.encode(byteArray);\n" = make_protocal_encode_item({notify_login_result, account}, gen_common:get_type()). | |||||
%% | |||||
%% test_make_protocal_decode_item() -> | |||||
%% "uint16 size = byteArray.read_uint16();\naccount.reserve(size);\nfor(int i=0; i<size;i++)\n{\n\taccount.push_back(byteArray.read_string());\n}\n" | |||||
%% = make_protocal_decode_item({array, string, account}, gen_common:get_type()), | |||||
%% "uint16 size = byteArray.read_uint16();\nresult.resize(size);\nfor(int i=0; i<size;i++)\n{\n\tresult[i].decode(byteArray);\n}\n" | |||||
%% = make_protocal_decode_item({array, notify_login_result, result}, gen_common:get_type()), | |||||
%% "uint16 size = byteArray.read_uint16();\naccount.reserve(size);\nfor(int i=0; i<size;i++)\n{\n\taccount.push_back(byteArray.read_int());\n}\n" | |||||
%% = make_protocal_decode_item({array, login_result, account}, gen_common:get_type()), | |||||
%% "account = byteArray.read_string();\n" = make_protocal_decode_item({string, account}, gen_common:get_type()), | |||||
%% "account = byteArray.read_int();\n" = make_protocal_decode_item({login_result, account}, gen_common:get_type()), | |||||
%% "account.decode(byteArray);\n" = make_protocal_decode_item({notify_login_result, account}, gen_common:get_type()). | |||||
%% | |||||
%% test_make_protocal_encode() -> | |||||
%% Result = make_protocal_encode([{array, string, account}, | |||||
%% {string, pwd}, | |||||
%% {player_data, data}, | |||||
%% {array, notify_login_result, result}], "", gen_common:get_type()), | |||||
%% io:format("~p~n", [Result]). | |||||
%% | |||||
%% test_make_protocal_decode() -> | |||||
%% Result = make_protocal_decode([{array, string, account}, | |||||
%% {string, pwd}, | |||||
%% {player_data, data}, | |||||
%% {array, notify_login_result, result}], "", gen_common:get_type()), | |||||
%% io:format("~p~n", [Result]). | |||||
%% | |||||
%% test_make_protocal_Variable() -> | |||||
%% Result = make_protocal_Variable([{array, string, account}, | |||||
%% {string, pwd}, | |||||
%% {player_data, data}, | |||||
%% {array, notify_login_result, result}], "", gen_common:get_type()), | |||||
%% io:format("~p~n", [Result]). |
@ -1,189 +0,0 @@ | |||||
---Read dynamic size | |||||
---@param b string @buffer. | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_dsize(b, p) | |||||
local bb = string.byte(b, p) | |||||
p = p + 1 | |||||
n = (bb&0XC0)>>6 | |||||
s = (bb&0X3F) | |||||
while n > 0 do | |||||
bb = string.byte(b, p) | |||||
p = p + 1 | |||||
s = (s<<8)|bb | |||||
n = n - 1 | |||||
end | |||||
return s, p | |||||
end | |||||
---Read int64 as 8 byte string | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_int64(b, p) | |||||
return string.unpack("<i8", b, p) | |||||
end | |||||
---Read uint64 as 8 byte string | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_uint64(b, p) | |||||
return string.unpack("<I8", b, p) | |||||
end | |||||
---Read double | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_double(b, p) | |||||
return string.unpack("<d", b, p) | |||||
end | |||||
---Read float | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_float(b, p) | |||||
return string.unpack("<f", b, p) | |||||
end | |||||
---Read int32 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_int32(b, p) | |||||
return string.unpack("<i4", b, p) | |||||
end | |||||
---Read uint32 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_uint32(b, p) | |||||
return string.unpack("<I4", b, p) | |||||
end | |||||
---Read int32 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_int16(b, p) | |||||
return string.unpack("<i2", b, p) | |||||
end | |||||
---Read uint16 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_uint16(b, p) | |||||
return string.unpack("<I2", b, p) | |||||
end | |||||
---Read int8 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_int8(b, p) | |||||
return string.unpack("<b", b, p) | |||||
end | |||||
---Read uint8 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_uint8(b, p) | |||||
return string.unpack("<B", b, p) | |||||
end | |||||
---Read bool | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return boolean, number | |||||
local function type_bool(b, p) | |||||
local r | |||||
r, p = string.unpack("<B", b, p) | |||||
if r == 0 then | |||||
return false, p | |||||
else | |||||
return true, p | |||||
end | |||||
end | |||||
---Read string | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@param valMax number @max value. | |||||
---@return string, number | |||||
local function type_string(b, p, valMax) | |||||
local l | |||||
l, p = type_dsize(b, p) | |||||
if valMax and l > valMax then | |||||
error("Invalid string length") | |||||
end | |||||
local r = string.sub(b, p, p+l-1) | |||||
return r, p+l | |||||
end | |||||
---Read enum | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_enum(b, p) | |||||
return type_uint8(b, p, 0) | |||||
end | |||||
---Read enum16 | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@return number, number | |||||
local function type_enum16(b, p) | |||||
return type_uint16(b, p) | |||||
end | |||||
---Read binary | |||||
---@param b string @buffer | |||||
---@param p number @buffer pointer. | |||||
---@param valMax number @max value. | |||||
---@return string, number | |||||
local function type_binary(b, p, valMax) | |||||
return type_string(b, p, valMax) | |||||
end | |||||
local function type_array(b, p, t, arrMax, valMax) | |||||
local l | |||||
l, p = type_dsize(b, p) | |||||
if l > arrMax then | |||||
error("Invalid array length") | |||||
else | |||||
local arr = {} | |||||
for i = 1, l do | |||||
local r | |||||
r, p = t(b, p, valMax) | |||||
arr[i] = r | |||||
end | |||||
return arr, p | |||||
end | |||||
end | |||||
BintalkReader = | |||||
{ | |||||
int64 = type_int64, | |||||
uint64 = type_uint64, | |||||
double = type_double, | |||||
float = type_float, | |||||
int32 = type_int32, | |||||
uint32 = type_uint32, | |||||
int16 = type_int16, | |||||
uint16 = type_uint16, | |||||
int8 = type_int8, | |||||
uint8 = type_uint8, | |||||
bool = type_bool, | |||||
string = type_string, | |||||
binary = type_binary, | |||||
enum = type_enum, | |||||
enum16 = type_enum16, | |||||
array = type_array, | |||||
} |
@ -1,111 +0,0 @@ | |||||
---Construct number. | |||||
---@param v number | |||||
---@return number | |||||
local function type_number(v) | |||||
if not v then return 0 end | |||||
assert(type(v) == "number") | |||||
return v | |||||
end | |||||
---Construct boolean | |||||
---@param v boolean | |||||
---@return boolean | |||||
local function type_boolean(v) | |||||
if not v then return false end | |||||
assert(type(v) == "boolean") | |||||
return v | |||||
end | |||||
---Construct string | |||||
---@param v string | |||||
---@return string | |||||
local function type_string(v) | |||||
if not v then return "" end | |||||
assert(type(v) == "string") | |||||
return v | |||||
end | |||||
---Construct array | |||||
---@param t any @inner type | |||||
---@param v table | |||||
local function type_array(t, v) | |||||
if not v then return {} end | |||||
assert(type(v) == "table") | |||||
local array = {} | |||||
for i,item in ipairs(v) do | |||||
table.insert(array, t(item)) | |||||
end | |||||
return array | |||||
end | |||||
---Enum metatable. | |||||
local enum_mt = {} | |||||
function enum_mt.__index(t, k) | |||||
local v = t._enum[k] | |||||
if v == nil then | |||||
error("Attempt to get invalid enum item:"..k) | |||||
end | |||||
return v | |||||
end | |||||
function enum_mt.__newindex(t, k, v) | |||||
error("Attempt to modify enum item:"..k) | |||||
end | |||||
function enum_mt.__call(t) | |||||
return 0 | |||||
end | |||||
function enum_mt.__pairs(t) | |||||
local function iter(t, k) | |||||
local v | |||||
k, v = next(t._enum, k) | |||||
if v then | |||||
return k,v | |||||
end | |||||
end | |||||
return iter, t._enum, nil | |||||
end | |||||
---User type metatable. | |||||
local struct_mt = {} | |||||
function struct_mt.__index(t, k) | |||||
-- Get default value. | |||||
local dv = t._defaults[k] | |||||
if dv == nil then | |||||
error("Attempt to get invalid struct field:"..k) | |||||
end | |||||
-- Get value. | |||||
return rawget(t._values, k) | |||||
end | |||||
function struct_mt.__newindex(t, k, v) | |||||
-- Get default value. | |||||
local dv = t._defaults[k] | |||||
if dv == nil then | |||||
error("Attempt to set invalid struct field:"..k) | |||||
end | |||||
if type(dv) ~= type(v) then | |||||
error("Attempt to set struct field with invalid value type:"..k.." "..type(v)) | |||||
end | |||||
rawset(t._values, k, v) | |||||
end | |||||
BintalkTypes = { | |||||
int64 = type_number, | |||||
uint64 = type_number, | |||||
double = type_number, | |||||
float = type_number, | |||||
int32 = type_number, | |||||
uint32 = type_number, | |||||
int16 = type_number, | |||||
uint16 = type_number, | |||||
int8 = type_number, | |||||
uint8 = type_number, | |||||
bool = type_boolean, | |||||
string = type_string, | |||||
binary = type_string, | |||||
enum = type_number, | |||||
enum16 = type_number, | |||||
array = type_array, | |||||
_enum_mt = enum_mt, | |||||
_struct_mt = struct_mt, | |||||
} |
@ -1,170 +0,0 @@ | |||||
---Write dynamic size | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_dsize(v, b) | |||||
if v <= 0X3F then | |||||
b[#b+1] = string.char(v) | |||||
elseif v <= 0X3FFF then | |||||
v = v | (1<<14) | |||||
local v1 = (v & 0XFF00)>>8 | |||||
local v2 = (v & 0XFF) | |||||
b[#b+1] = string.char(v1, v2) | |||||
elseif v <= 0X3FFFFF then | |||||
v = v | (2<<22) | |||||
local v1 = (v & 0XFF0000)>>16 | |||||
local v2 = (v & 0XFF00)>>8 | |||||
local v3 = (v & 0XFF) | |||||
b[#b+1] = string.char(v1, v2, v3) | |||||
elseif v <= 0X3FFFFFFF then | |||||
v = v | (3<<30) | |||||
local v1 = (v & 0XFF000000)>>24 | |||||
local v2 = (v & 0XFF0000)>>16 | |||||
local v3 = (v & 0XFF00)>>8 | |||||
local v4 = (v & 0XFF) | |||||
b[#b+1] = string.char(v1, v2, v3, v4) | |||||
else | |||||
error("Invalid dynamic size") | |||||
end | |||||
end | |||||
---@param v number @value | |||||
---@param b string[] @buffer. | |||||
local function type_int64(v, b) | |||||
b[#b+1] = string.pack("<i8", v) | |||||
end | |||||
---@param v number @value | |||||
---@param b string[] @buffer. | |||||
local function type_uint64(v, b) | |||||
b[#b+1] = string.pack("<I8", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_double(v, b) | |||||
b[#b+1] = string.pack("<d", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_float(v, b) | |||||
b[#b+1] = string.pack("<f", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_int32(v, b) | |||||
b[#b+1] = string.pack("<i4", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_uint32(v, b) | |||||
b[#b+1] = string.pack("<I4", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_int16(v, b) | |||||
b[#b+1] = string.pack("<i2", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_uint16(v, b) | |||||
b[#b+1] = string.pack("<I2", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_int8(v, b) | |||||
b[#b+1] = string.pack("<b", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_uint8(v, b) | |||||
b[#b+1] = string.pack("<B", v) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_bool(v, b) | |||||
b[#b+1] = string.pack("<B", (v and 1 or 0)) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_string(v, b) | |||||
assert(type(v) == "string") | |||||
type_dsize(#v, b) | |||||
b[#b+1] = v | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_enum(v, b) | |||||
type_uint8(v, b) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_enum16(v, b) | |||||
type_uint16(v, b) | |||||
end | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_binary(v, b) | |||||
assert(type(v) == "string") | |||||
type_dsize(#v, b) | |||||
b[#b+1] = v | |||||
end | |||||
---@param t fun() | |||||
---@param v number @size | |||||
---@param b string[] @buffer. | |||||
local function type_array(t, v, b) | |||||
assert(type(v) == "table") | |||||
type_dsize(#v, b) | |||||
for i = 1, #v do | |||||
t(v[i], b) | |||||
end | |||||
end | |||||
BintalkWriter = | |||||
{ | |||||
int64 = type_int64, | |||||
uint64 = type_uint64, | |||||
double = type_double, | |||||
float = type_float, | |||||
int32 = type_int32, | |||||
uint32 = type_uint32, | |||||
int16 = type_int16, | |||||
uint16 = type_uint16, | |||||
int8 = type_int8, | |||||
uint8 = type_uint8, | |||||
bool = type_bool, | |||||
string = type_string, | |||||
binary = type_binary, | |||||
enum = type_enum, | |||||
enum16 = type_enum16, | |||||
array = type_array, | |||||
} |