@ -0,0 +1,106 @@ | |||
// 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,214 @@ | |||
#include "Options.h" | |||
#include "Context.h" | |||
#include "CodeFile.h" | |||
#include "CodeGenerator.h" | |||
DECLARE_CG(CSGenerator, cs); | |||
static void generateEnum(CodeFile& f, Enum* e) | |||
{ | |||
f.output("public enum %s : %s", e->getNameC(), e->isEnum16()?"ushort":"byte"); | |||
f.indent("{"); | |||
for(size_t i = 0; i < e->items_.size(); i++) | |||
f.output("%s,", e->items_[i].c_str()); | |||
f.recover("}"); | |||
f.output("namespace bintalk"); | |||
f.indent("{"); | |||
f.output("public static partial class ProtocolReader"); | |||
f.indent("{"); | |||
f.output("public static bool read(bintalk.IReader r, ref %s v, uint maxValue)", e->getNameC()); | |||
f.indent("{"); | |||
f.output("%s e = 0;", e->isEnum16()?"ushort":"byte"); | |||
f.output("if(!read(r, ref e, 0)) return false;"); | |||
f.output("v = (%s)e;", e->getNameC()); | |||
f.output("return true;"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
f.output("public static partial class ProtocolWriter"); | |||
f.indent("{"); | |||
f.output("public static void write(bintalk.IWriter w, %s v)", e->getNameC()); | |||
f.indent("{"); | |||
f.output("write(w, (%s)v);", e->isEnum16()?"ushort":"byte"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
} | |||
static const char* getFieldInnerTypeName(Field& f) | |||
{ | |||
switch(f.type_) | |||
{ | |||
case Field::FT_INT64: return "long"; | |||
case Field::FT_UINT64: return "ulong"; | |||
case Field::FT_DOUBLE: return "double"; | |||
case Field::FT_FLOAT: return "float"; | |||
case Field::FT_INT32: return "int"; | |||
case Field::FT_UINT32: return "uint"; | |||
case Field::FT_INT16: return "short"; | |||
case Field::FT_UINT16: return "ushort"; | |||
case Field::FT_INT8: return "sbyte"; | |||
case Field::FT_UINT8: return "byte"; | |||
case Field::FT_BOOL: return "bool"; | |||
case Field::FT_STRING: return "string"; | |||
case Field::FT_BINARY: return "byte[]"; | |||
case Field::FT_USER: | |||
case Field::FT_ENUM: return f.userType_->getNameC(); | |||
} | |||
return NULL; | |||
} | |||
static void getFieldTypeName(Field& f, std::string& name) | |||
{ | |||
name = getFieldInnerTypeName(f); | |||
if(f.isArray()) | |||
name = "List<" + name + ">"; | |||
} | |||
static void getFieldInnerDefault(Field& f, std::string& name) | |||
{ | |||
switch(f.type_) | |||
{ | |||
case Field::FT_INT64: | |||
case Field::FT_UINT64: | |||
case Field::FT_DOUBLE: | |||
case Field::FT_FLOAT: | |||
case Field::FT_INT32: | |||
case Field::FT_UINT32: | |||
case Field::FT_INT16: | |||
case Field::FT_UINT16: | |||
case Field::FT_INT8: | |||
case Field::FT_UINT8: name = "0"; break; | |||
case Field::FT_BOOL: name = "false"; break; | |||
case Field::FT_STRING: name = "\"\""; break; | |||
case Field::FT_BINARY: name = "new byte[0]"; break; | |||
case Field::FT_USER: name = "new "; name += f.userType_->name_; name += "()"; break; | |||
case Field::FT_ENUM: name = "("; name += f.userType_->name_; name += ")(0)"; break; | |||
} | |||
} | |||
static void getFieldDefault(Field& f, std::string& name) | |||
{ | |||
if(f.isArray()) | |||
{ | |||
name = "new "; | |||
std::string tn; | |||
getFieldTypeName(f, tn); | |||
name += tn; | |||
name += "()"; | |||
} | |||
else | |||
getFieldInnerDefault(f, name); | |||
} | |||
static void generateFieldSCode(CodeFile& f, Field& field) | |||
{ | |||
if(field.isArray()) | |||
{ | |||
f.indent("{"); | |||
f.output("bintalk.ProtocolWriter.writeDynSize(__w__, (uint)%s.Count);", field.getNameC()); | |||
f.output("foreach(%s __vi__ in %s) bintalk.ProtocolWriter.write(__w__, __vi__);", | |||
getFieldInnerTypeName(field), | |||
field.getNameC()); | |||
f.recover("}"); | |||
} | |||
else | |||
f.output("bintalk.ProtocolWriter.write(__w__, %s);", field.getNameC()); | |||
} | |||
static void generateFieldContainerSCode(CodeFile& f, FieldContainer* fc) | |||
{ | |||
for(size_t i = 0; i < fc->fields_.size(); i++) | |||
generateFieldSCode(f, fc->fields_[i]); | |||
} | |||
static void generateFieldDSCode(CodeFile& f, Field& field) | |||
{ | |||
if(field.isArray()) | |||
{ | |||
f.indent("{"); | |||
f.output("uint __s__;"); | |||
f.output("if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0X%X) return false;", field.maxArray_); | |||
f.output("for(uint __i__ = 0; __i__ < __s__; __i__++)"); | |||
f.indent("{"); | |||
std::string idft; | |||
getFieldInnerDefault(field, idft); | |||
f.output("%s __vi__ = %s;", getFieldInnerTypeName(field), idft.c_str()); | |||
f.output("if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X%X)) return false;", field.maxValue_); | |||
f.output("%s.Add(__vi__);", field.getNameC()); | |||
f.recover("}"); | |||
f.recover("}"); | |||
} | |||
else | |||
f.output("if(!bintalk.ProtocolReader.read(__r__, ref %s, 0X%X)) return false;", field.getNameC(), field.maxValue_); | |||
} | |||
static void generateFieldContainerDSCode(CodeFile& f, FieldContainer* fc) | |||
{ | |||
for(size_t i = 0; i < fc->fields_.size(); i++) | |||
generateFieldDSCode(f, fc->fields_[i]); | |||
} | |||
static void generateStruct(CodeFile& f, Struct* s) | |||
{ | |||
f.output("public class %s", s->getNameC()); | |||
f.indent("{"); | |||
// fields. | |||
for(size_t i = 0; i < s->fields_.size(); i++) | |||
{ | |||
Field& field = s->fields_[i]; | |||
std::string tn; | |||
getFieldTypeName(field, tn); | |||
std::string dft; | |||
getFieldDefault(field, dft); | |||
f.output("public %s %s= %s;", | |||
tn.c_str(), | |||
field.getNameC(), | |||
dft.c_str()); | |||
} | |||
// serialize code. | |||
f.output("public void serialize(bintalk.IWriter __w__)"); | |||
f.indent("{"); | |||
generateFieldContainerSCode(f, s); | |||
f.recover("}"); | |||
// deserialize code. | |||
f.output("public bool deserialize(bintalk.IReader __r__)"); | |||
f.indent("{"); | |||
generateFieldContainerDSCode(f, s); | |||
f.output("return true;"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
//////////////////////////////////////////////////////////////////////////////// | |||
f.output("namespace bintalk"); | |||
f.indent("{"); | |||
f.output("public static partial class ProtocolReader"); | |||
f.indent("{"); | |||
f.output("public static bool read(bintalk.IReader r, ref %s v, uint maxValue)", s->getNameC()); | |||
f.indent("{"); | |||
f.output("return v.deserialize(r);"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
f.output("public static partial class ProtocolWriter"); | |||
f.indent("{"); | |||
f.output("public static void write(bintalk.IWriter w, %s v)", s->getNameC()); | |||
f.indent("{"); | |||
f.output("v.serialize(w);"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
f.recover("}"); | |||
} | |||
void CSGenerator::generate() | |||
{ | |||
CodeFile f(gOptions.output_ + gOptions.inputFS_ + ".cs"); | |||
f.output("using System.Collections.Generic;"); | |||
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,13 @@ | |||
namespace bintalk | |||
{ | |||
/** Abstract interface for reading binary data. */ | |||
public interface IReader | |||
{ | |||
/** | |||
* @param size data size want to read. | |||
* @param[out] data buffer. | |||
* @param[out] data buffer start id. | |||
*/ | |||
bool read(uint size, out byte[] data, out int startId); | |||
} | |||
} |
@ -0,0 +1,9 @@ | |||
namespace bintalk | |||
{ | |||
/** Abstract interface for writing binary data. */ | |||
public interface IWriter | |||
{ | |||
/** Write some binary data. */ | |||
void write(byte[] data); | |||
} | |||
} |
@ -0,0 +1,148 @@ | |||
using System; | |||
using System.Text; | |||
using System.Collections.Generic; | |||
namespace bintalk | |||
{ | |||
/** This class can read basic types by using a bintalk.IReader object. */ | |||
public static partial class ProtocolReader | |||
{ | |||
public static bool readMid(bintalk.IReader r, ref ushort v) | |||
{ | |||
return read(r, ref v, 0); | |||
} | |||
// int64 | |||
public static bool read(bintalk.IReader r, ref long v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(8, out data, out startId)) return false; | |||
v = BitConverter.ToInt64(data, startId); | |||
return true; | |||
} | |||
// uint64 | |||
public static bool read(bintalk.IReader r, ref ulong v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(8, out data, out startId)) return false; | |||
v = BitConverter.ToUInt64(data, startId); | |||
return true; | |||
} | |||
// double | |||
public static bool read(bintalk.IReader r, ref double v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(8, out data, out startId)) return false; | |||
v = BitConverter.ToDouble(data, startId); | |||
return true; | |||
} | |||
// float | |||
public static bool read(bintalk.IReader r, ref float v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(4, out data, out startId)) return false; | |||
v = BitConverter.ToSingle(data, startId); | |||
return true; | |||
} | |||
// int32 | |||
public static bool read(bintalk.IReader r, ref int v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(4, out data, out startId)) return false; | |||
v = BitConverter.ToInt32(data, startId); | |||
return true; | |||
} | |||
// uint32 | |||
public static bool read(bintalk.IReader r, ref uint v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(4, out data, out startId)) return false; | |||
v = BitConverter.ToUInt32(data, startId); | |||
return true; | |||
} | |||
// int16 | |||
public static bool read(bintalk.IReader r, ref short v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(2, out data, out startId)) return false; | |||
v = BitConverter.ToInt16(data, startId); | |||
return true; | |||
} | |||
// uint16 | |||
public static bool read(bintalk.IReader r, ref ushort v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(2, out data, out startId)) return false; | |||
v = BitConverter.ToUInt16(data, startId); | |||
return true; | |||
} | |||
// int8 | |||
public static bool read(bintalk.IReader r, ref sbyte v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(1, out data, out startId)) | |||
return false; | |||
v = (sbyte)data[startId]; | |||
return true; | |||
} | |||
// uint8 | |||
public static bool read(bintalk.IReader r, ref byte v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(1, out data, out startId)) | |||
return false; | |||
v = data[startId]; | |||
return true; | |||
} | |||
// bool | |||
public static bool read(bintalk.IReader r, ref bool v, uint maxValue) | |||
{ | |||
byte[] data; int startId; | |||
if (!r.read(1, out data, out startId)) | |||
return false; | |||
v = (data[startId] == 0)?false:true; | |||
return true; | |||
} | |||
// string. | |||
public static bool read(bintalk.IReader r, ref string v, uint maxValue) | |||
{ | |||
uint s; | |||
if (!readDynSize(r, out s) || s > maxValue) | |||
return false; | |||
byte[] data; int startId; | |||
if(!r.read(s, out data, out startId)) | |||
return false; | |||
v = Encoding.UTF8.GetString(data, startId, (int)s); | |||
return true; | |||
} | |||
// binary. | |||
public static bool read(bintalk.IReader r, ref byte[] v, uint maxValue) | |||
{ | |||
uint s; | |||
if (!readDynSize(r, out s) || s > maxValue) | |||
return false; | |||
v = new byte[s]; | |||
byte[] data; int startId; | |||
if(!r.read(s, out data, out startId)) | |||
return false; | |||
Array.Copy(data, startId, v, 0, s); | |||
return true; | |||
} | |||
// dynamic size. | |||
public static bool readDynSize(bintalk.IReader r, out uint s) | |||
{ | |||
s = 0; | |||
byte b = 0; | |||
if (!read(r, ref b, 0)) | |||
return false; | |||
uint n = (uint)((b & 0XC0) >> 6); | |||
s = (uint)(b & 0X3F); | |||
for (int i = 0; i < n; i++) | |||
{ | |||
if (!read(r, ref b, 0)) | |||
return false; | |||
s = (s << 8) | b; | |||
} | |||
return true; | |||
} | |||
} | |||
} |
@ -0,0 +1,113 @@ | |||
using System; | |||
using System.Text; | |||
using System.Collections.Generic; | |||
namespace bintalk | |||
{ | |||
/** This class can write basic types by using a bintalk.IWriter object. */ | |||
public static partial class ProtocolWriter | |||
{ | |||
public static void writeMid(bintalk.IWriter w, int v) | |||
{ | |||
write(w, (ushort)v); | |||
} | |||
// int 64 | |||
public static void write(bintalk.IWriter w, long v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// uint64 | |||
public static void write(bintalk.IWriter w, ulong v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// double | |||
public static void write(bintalk.IWriter w, double v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// float | |||
public static void write(bintalk.IWriter w, float v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// int32 | |||
public static void write(bintalk.IWriter w, int v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// uint32 | |||
public static void write(bintalk.IWriter w, uint v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// int16 | |||
public static void write(bintalk.IWriter w, short v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// uint16 | |||
public static void write(bintalk.IWriter w, ushort v) | |||
{ | |||
w.write(BitConverter.GetBytes(v)); | |||
} | |||
// int8 | |||
public static void write(bintalk.IWriter w, sbyte v) | |||
{ | |||
w.write(new byte[1]{(byte)v}); | |||
} | |||
// uint8 | |||
public static void write(bintalk.IWriter w, byte v) | |||
{ | |||
w.write(new byte[1]{v}); | |||
} | |||
// bool | |||
public static void write(bintalk.IWriter w, bool v) | |||
{ | |||
write(w, (byte)(v?1:0)); | |||
} | |||
// string | |||
public static void write(bintalk.IWriter w, string v) | |||
{ | |||
if (v == null || v.Length == 0) | |||
writeDynSize(w, 0); | |||
else | |||
{ | |||
byte[] str = Encoding.UTF8.GetBytes(v); | |||
uint len = (uint)str.Length; | |||
writeDynSize(w, len); | |||
if (len > 0) | |||
w.write(str); | |||
} | |||
} | |||
// binary. | |||
public static void write(bintalk.IWriter w, byte[] v) | |||
{ | |||
if (v == null || v.Length == 0) | |||
writeDynSize(w, 0); | |||
else | |||
{ | |||
uint s = (uint)v.Length; | |||
writeDynSize(w, s); | |||
w.write(v); | |||
} | |||
} | |||
// dynamic size. | |||
public static void writeDynSize(bintalk.IWriter w, uint s) | |||
{ | |||
byte[] b = BitConverter.GetBytes(s); | |||
int n = 0; | |||
if (s <= 0X3F) | |||
n = 0; | |||
else if (s <= 0X3FFF) | |||
n = 1; | |||
else if(s <= 0X3FFFFF) | |||
n = 2; | |||
else if(s <= 0X3FFFFFFF) | |||
n = 3; | |||
b[n] |= (byte)(n << 6); | |||
for(int i = n; i >= 0; i--) | |||
write(w, b[i]); | |||
} | |||
} | |||
} |
@ -0,0 +1,676 @@ | |||
using System.Collections.Generic; | |||
public enum EnumName : byte | |||
{ | |||
EN1, | |||
EN2, | |||
EN3, | |||
} | |||
namespace bintalk | |||
{ | |||
public static partial class ProtocolReader | |||
{ | |||
public static bool read(bintalk.IReader r, ref EnumName v, uint maxValue) | |||
{ | |||
byte e = 0; | |||
if(!read(r, ref e, 0)) return false; | |||
v = (EnumName)e; | |||
return true; | |||
} | |||
} | |||
public static partial class ProtocolWriter | |||
{ | |||
public static void write(bintalk.IWriter w, EnumName v) | |||
{ | |||
write(w, (byte)v); | |||
} | |||
} | |||
} | |||
public enum EnumName16 : ushort | |||
{ | |||
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, | |||
} | |||
namespace bintalk | |||
{ | |||
public static partial class ProtocolReader | |||
{ | |||
public static bool read(bintalk.IReader r, ref EnumName16 v, uint maxValue) | |||
{ | |||
ushort e = 0; | |||
if(!read(r, ref e, 0)) return false; | |||
v = (EnumName16)e; | |||
return true; | |||
} | |||
} | |||
public static partial class ProtocolWriter | |||
{ | |||
public static void write(bintalk.IWriter w, EnumName16 v) | |||
{ | |||
write(w, (ushort)v); | |||
} | |||
} | |||
} | |||
public class StructType | |||
{ | |||
public string aaa_= ""; | |||
public int bbb_= 0; | |||
public void serialize(bintalk.IWriter __w__) | |||
{ | |||
bintalk.ProtocolWriter.write(__w__, aaa_); | |||
bintalk.ProtocolWriter.write(__w__, bbb_); | |||
} | |||
public bool deserialize(bintalk.IReader __r__) | |||
{ | |||
if(!bintalk.ProtocolReader.read(__r__, ref aaa_, 0XFFFFFFFF)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref bbb_, 0X0)) return false; | |||
return true; | |||
} | |||
} | |||
namespace bintalk | |||
{ | |||
public static partial class ProtocolReader | |||
{ | |||
public static bool read(bintalk.IReader r, ref StructType v, uint maxValue) | |||
{ | |||
return v.deserialize(r); | |||
} | |||
} | |||
public static partial class ProtocolWriter | |||
{ | |||
public static void write(bintalk.IWriter w, StructType v) | |||
{ | |||
v.serialize(w); | |||
} | |||
} | |||
} | |||
public class StructBase | |||
{ | |||
public double double_= 0; | |||
public float float_= 0; | |||
public long int64_= 0; | |||
public ulong uint64_= 0; | |||
public int int32_= 0; | |||
public uint uint32_= 0; | |||
public short int16_= 0; | |||
public ushort uint16_= 0; | |||
public sbyte int8_= 0; | |||
public byte uint8_= 0; | |||
public bool bool_= false; | |||
public EnumName enum_= (EnumName)(0); | |||
public EnumName16 enum16_= (EnumName16)(0); | |||
public StructType struct_= new StructType(); | |||
public string string_= ""; | |||
public string string1_= ""; | |||
public byte[] bin_= new byte[0]; | |||
public byte[] bin1_= new byte[0]; | |||
public List<double> doubleArray_= new List<double>(); | |||
public List<float> floatArray_= new List<float>(); | |||
public List<long> int64Array_= new List<long>(); | |||
public List<ulong> uint64Array_= new List<ulong>(); | |||
public List<int> int32Array_= new List<int>(); | |||
public List<uint> uint32Array_= new List<uint>(); | |||
public List<short> int16Array_= new List<short>(); | |||
public List<ushort> uint16Array_= new List<ushort>(); | |||
public List<sbyte> int8Array_= new List<sbyte>(); | |||
public List<byte> uint8Array_= new List<byte>(); | |||
public List<bool> boolArray_= new List<bool>(); | |||
public List<string> strArray_= new List<string>(); | |||
public List<string> strArray1_= new List<string>(); | |||
public List<byte[]> binArray_= new List<byte[]>(); | |||
public List<byte[]> bin1Array_= new List<byte[]>(); | |||
public List<EnumName> enumArray_= new List<EnumName>(); | |||
public List<StructType> structArray_= new List<StructType>(); | |||
public void serialize(bintalk.IWriter __w__) | |||
{ | |||
bintalk.ProtocolWriter.write(__w__, double_); | |||
bintalk.ProtocolWriter.write(__w__, float_); | |||
bintalk.ProtocolWriter.write(__w__, int64_); | |||
bintalk.ProtocolWriter.write(__w__, uint64_); | |||
bintalk.ProtocolWriter.write(__w__, int32_); | |||
bintalk.ProtocolWriter.write(__w__, uint32_); | |||
bintalk.ProtocolWriter.write(__w__, int16_); | |||
bintalk.ProtocolWriter.write(__w__, uint16_); | |||
bintalk.ProtocolWriter.write(__w__, int8_); | |||
bintalk.ProtocolWriter.write(__w__, uint8_); | |||
bintalk.ProtocolWriter.write(__w__, bool_); | |||
bintalk.ProtocolWriter.write(__w__, enum_); | |||
bintalk.ProtocolWriter.write(__w__, enum16_); | |||
bintalk.ProtocolWriter.write(__w__, struct_); | |||
bintalk.ProtocolWriter.write(__w__, string_); | |||
bintalk.ProtocolWriter.write(__w__, string1_); | |||
bintalk.ProtocolWriter.write(__w__, bin_); | |||
bintalk.ProtocolWriter.write(__w__, bin1_); | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)doubleArray_.Count); | |||
foreach(double __vi__ in doubleArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)floatArray_.Count); | |||
foreach(float __vi__ in floatArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)int64Array_.Count); | |||
foreach(long __vi__ in int64Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)uint64Array_.Count); | |||
foreach(ulong __vi__ in uint64Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)int32Array_.Count); | |||
foreach(int __vi__ in int32Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)uint32Array_.Count); | |||
foreach(uint __vi__ in uint32Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)int16Array_.Count); | |||
foreach(short __vi__ in int16Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)uint16Array_.Count); | |||
foreach(ushort __vi__ in uint16Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)int8Array_.Count); | |||
foreach(sbyte __vi__ in int8Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)uint8Array_.Count); | |||
foreach(byte __vi__ in uint8Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)boolArray_.Count); | |||
foreach(bool __vi__ in boolArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)strArray_.Count); | |||
foreach(string __vi__ in strArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)strArray1_.Count); | |||
foreach(string __vi__ in strArray1_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)binArray_.Count); | |||
foreach(byte[] __vi__ in binArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)bin1Array_.Count); | |||
foreach(byte[] __vi__ in bin1Array_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)enumArray_.Count); | |||
foreach(EnumName __vi__ in enumArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
{ | |||
bintalk.ProtocolWriter.writeDynSize(__w__, (uint)structArray_.Count); | |||
foreach(StructType __vi__ in structArray_) bintalk.ProtocolWriter.write(__w__, __vi__); | |||
} | |||
} | |||
public bool deserialize(bintalk.IReader __r__) | |||
{ | |||
if(!bintalk.ProtocolReader.read(__r__, ref double_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref float_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref int64_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref uint64_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref int32_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref uint32_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref int16_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref uint16_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref int8_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref uint8_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref bool_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref enum_, 0X2)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref enum16_, 0X100)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref struct_, 0X0)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref string_, 0XFFFFFFFF)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref string1_, 0X20)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref bin_, 0XFFFFFFFF)) return false; | |||
if(!bintalk.ProtocolReader.read(__r__, ref bin1_, 0X20)) return false; | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
double __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
doubleArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
float __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
floatArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
long __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
int64Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
ulong __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
uint64Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
int __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
int32Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
uint __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
uint32Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
short __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
int16Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
ushort __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
uint16Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
sbyte __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
int8Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
byte __vi__ = 0; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
uint8Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
bool __vi__ = false; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
boolArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
string __vi__ = ""; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0XFFFFFFFF)) return false; | |||
strArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0X8) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
string __vi__ = ""; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X10)) return false; | |||
strArray1_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
byte[] __vi__ = new byte[0]; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0XFFFFFFFF)) return false; | |||
binArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
byte[] __vi__ = new byte[0]; | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X20)) return false; | |||
bin1Array_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
EnumName __vi__ = (EnumName)(0); | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X2)) return false; | |||
enumArray_.Add(__vi__); | |||
} | |||
} | |||
{ | |||
uint __s__; | |||
if (!bintalk.ProtocolReader.readDynSize(__r__, out __s__) || __s__ > 0XFFFFFFFF) return false; | |||
for(uint __i__ = 0; __i__ < __s__; __i__++) | |||
{ | |||
StructType __vi__ = new StructType(); | |||
if (!bintalk.ProtocolReader.read(__r__, ref __vi__, 0X0)) return false; | |||
structArray_.Add(__vi__); | |||
} | |||
} | |||
return true; | |||
} | |||
} | |||
namespace bintalk | |||
{ | |||
public static partial class ProtocolReader | |||
{ | |||
public static bool read(bintalk.IReader r, ref StructBase v, uint maxValue) | |||
{ | |||
return v.deserialize(r); | |||
} | |||
} | |||
public static partial class ProtocolWriter | |||
{ | |||
public static void write(bintalk.IWriter w, StructBase v) | |||
{ | |||
v.serialize(w); | |||
} | |||
} | |||
} |
@ -0,0 +1,562 @@ | |||
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 |
@ -0,0 +1,161 @@ | |||
#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,189 @@ | |||
---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 | |||
-- 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, | |||
} |
@ -0,0 +1,111 @@ | |||
---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, | |||
} |
@ -0,0 +1,170 @@ | |||
---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("<i8", v) | |||
end | |||
-- Write uint64 as string | |||
---@param v number @value | |||
---@param b string[] @buffer. | |||
local function type_uint64(v, b) | |||
b[#b+1] = string.pack("<I8", v) | |||
end | |||
-- Write double | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_double(v, b) | |||
b[#b+1] = string.pack("<d", v) | |||
end | |||
-- Write float | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_float(v, b) | |||
b[#b+1] = string.pack("<f", v) | |||
end | |||
-- Write int32 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_int32(v, b) | |||
b[#b+1] = string.pack("<i4", v) | |||
end | |||
-- Write uint32 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_uint32(v, b) | |||
b[#b+1] = string.pack("<I4", v) | |||
end | |||
-- Write int16 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_int16(v, b) | |||
b[#b+1] = string.pack("<i2", v) | |||
end | |||
-- Write uint16 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_uint16(v, b) | |||
b[#b+1] = string.pack("<I2", v) | |||
end | |||
-- Write int8 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_int8(v, b) | |||
b[#b+1] = string.pack("<b", v) | |||
end | |||
-- Write uint8 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_uint8(v, b) | |||
b[#b+1] = string.pack("<B", v) | |||
end | |||
-- Write bool | |||
---@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 | |||
-- Write string | |||
---@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 | |||
-- Write enum | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_enum(v, b) | |||
type_uint8(v, b) | |||
end | |||
-- Write enum16 | |||
---@param v number @size | |||
---@param b string[] @buffer. | |||
local function type_enum16(v, b) | |||
type_uint16(v, b) | |||
end | |||
-- Write binary | |||
---@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 | |||
-- Write array of type t | |||
---@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, | |||
} |