diff --git a/proto/Example.btk b/proto/Example.btk deleted file mode 100644 index 9a1dbc7..0000000 --- a/proto/Example.btk +++ /dev/null @@ -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_; -} diff --git a/src/writeCs/ProtocolMsg.cs b/src/writeCs/sample/ProtocolMsg.cs similarity index 100% rename from src/writeCs/ProtocolMsg.cs rename to src/writeCs/sample/ProtocolMsg.cs diff --git a/src/writeCs/cs序列化1.jpg b/src/writeCs/sample/cs序列化1.jpg similarity index 100% rename from src/writeCs/cs序列化1.jpg rename to src/writeCs/sample/cs序列化1.jpg diff --git a/src/writeCs/cs序列化2.png b/src/writeCs/sample/cs序列化2.png similarity index 100% rename from src/writeCs/cs序列化2.png rename to src/writeCs/sample/cs序列化2.png diff --git a/src/writeLua/ByteArray.lua b/src/writeLua/ByteArray.lua new file mode 100644 index 0000000..a046587 --- /dev/null +++ b/src/writeLua/ByteArray.lua @@ -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 + diff --git a/src/writeLua/Example.lua b/src/writeLua/Example.lua deleted file mode 100644 index e5a282d..0000000 --- a/src/writeLua/Example.lua +++ /dev/null @@ -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 diff --git a/src/writeLua/LUAGenerator.cpp b/src/writeLua/LUAGenerator.cpp deleted file mode 100644 index 3fe56d5..0000000 --- a/src/writeLua/LUAGenerator.cpp +++ /dev/null @@ -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::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()); - } -} \ No newline at end of file diff --git a/src/writeLua/gLuaField.erl b/src/writeLua/gLuaField.erl new file mode 100644 index 0000000..3d883ad --- /dev/null +++ b/src/writeLua/gLuaField.erl @@ -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. diff --git a/src/writeLua/gLuaGen.erl b/src/writeLua/gLuaGen.erl new file mode 100644 index 0000000..75dbbab --- /dev/null +++ b/src/writeLua/gLuaGen.erl @@ -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 + %% #include + %% ". +%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成函数的方法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +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 + "\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 +%% "uint16 size = byteArray.read_uint16();\naccount.reserve(size);\nfor(int i=0; i +%% 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]). diff --git a/src/writeLua/reader.lua b/src/writeLua/reader.lua deleted file mode 100644 index 36f70e2..0000000 --- a/src/writeLua/reader.lua +++ /dev/null @@ -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(" 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 - --- Read array of type t. -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, -} diff --git a/src/writeLua/types.lua b/src/writeLua/types.lua deleted file mode 100644 index 57b9526..0000000 --- a/src/writeLua/types.lua +++ /dev/null @@ -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, -} \ No newline at end of file diff --git a/src/writeLua/writer.lua b/src/writeLua/writer.lua deleted file mode 100644 index 2595883..0000000 --- a/src/writeLua/writer.lua +++ /dev/null @@ -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 - --- Write int64 as string ----@param v number @value ----@param b string[] @buffer. -local function type_int64(v, b) - b[#b+1] = string.pack("