49 const map<string, string> &parsed_options,
52 (void) parsed_options;
55 this->out_dir_base_ =
"gen-c";
58 this->nspace = program_->get_namespace(
"c");
60 if (this->nspace.empty()) {
67 char *tmp = strdup(this->nspace.c_str());
68 for (
unsigned int i = 0; i < strlen(tmp); i++) {
73 this->nspace = string(tmp, strlen(tmp));
92 void init_generator();
93 void close_generator();
96 void generate_typedef(
t_typedef *ttypedef);
97 void generate_enum(
t_enum *tenum);
98 void generate_consts(vector<t_const *> consts);
99 void generate_struct(
t_struct *tstruct);
100 void generate_service(
t_service *tservice);
101 void generate_xception(
t_struct *tstruct);
102 void generate_sandesh(
t_sandesh *tsandesh);
103 void generate_sandesh_info();
120 bool is_complex_type(
t_type *ttype);
121 string type_name(
t_type* ttype,
bool in_typedef=
false,
bool is_const=
false);
125 string argument_list(
t_struct *tstruct);
126 string declare_field(
t_field *tfield,
bool init=
false,
bool pointer=
false,
bool constant=
false,
bool reference=
false);
130 void generate_service_client(
t_service *tservice);
131 void generate_service_server(
t_service *tservice);
132 void generate_object(
t_struct *tstruct);
133 void generate_object(
t_sandesh *tsandesh);
134 void generate_object_internal(
string name,
const vector<t_field *> &members,
bool is_sandesh);
135 void generate_struct_writer(ofstream &out,
string name,
const vector<t_field *> &fields,
bool is_sandesh,
bool is_function=
true);
136 void generate_struct_writer_to_buffer(ofstream &out,
string name,
const vector<t_field *> &fields,
bool is_sandesh,
bool is_function=
true);
137 void generate_struct_reader(ofstream &out,
string name,
const vector<t_field *> &fields,
bool is_sandesh,
bool is_function=
true);
138 void generate_struct_reader_from_buffer(ofstream &out,
string name,
const vector<t_field *> &fields,
bool is_sandesh,
bool is_function=
true);
139 void generate_struct_deleter(ofstream &out,
string name,
const vector<t_field *> &fields,
bool is_sandesh,
bool is_function=
true);
141 void generate_buffer_bounds_chk(ofstream &out,
string length,
int error_ret);
142 void generate_buffer_incr_offset(ofstream &out,
string length);
144 void generate_write_buffer_memcpy(ofstream &out,
string source,
string length,
bool ref);
145 void generate_write_buffer_memcpy_incr_offset(ofstream &out,
string source,
string length,
bool ref);
146 void generate_write_buffer_chk_memcpy_incr_offset(ofstream &out,
string source,
string length,
int error_ret,
bool ref);
147 void generate_write_buffer_binary(ofstream &out,
string buf,
string buf_len,
int error_ret);
149 void generate_struct_begin_writer_to_buffer(ofstream &out,
string name,
bool is_sandesh,
int error_ret);
150 void generate_struct_end_writer_to_buffer(ofstream &out,
bool is_sandesh);
151 void generate_field_begin_writer_to_buffer(ofstream &out,
string key,
string field_type,
int error_ret);
152 void generate_field_end_writer_to_buffer(ofstream &out);
153 void generate_field_stop_writer_to_buffer(ofstream &out,
int error_ret);
154 void generate_list_begin_writer_to_buffer(ofstream &out,
string element_type,
string length,
int error_ret);
155 void generate_list_end_writer_to_buffer(ofstream &out);
157 void generate_serialize_bool_to_buffer(ofstream &out,
string name,
int error_ret);
158 void generate_serialize_byte_to_buffer(ofstream &out,
string name,
int error_ret);
159 void generate_serialize_i16_to_buffer(ofstream &out,
string name,
int error_ret);
160 void generate_serialize_i32_to_buffer(ofstream &out,
string name,
int error_ret);
161 void generate_serialize_i64_to_buffer(ofstream &out,
string name,
int error_ret);
162 void generate_serialize_u16_to_buffer(ofstream &out,
string name,
int error_ret);
163 void generate_serialize_u32_to_buffer(ofstream &out,
string name,
int error_ret);
164 void generate_serialize_u64_to_buffer(ofstream &out,
string name,
int error_ret);
165 void generate_serialize_string_to_buffer(ofstream &out,
string name,
int error_ret);
166 void generate_serialize_xml_to_buffer(ofstream &out,
string name,
int error_ret);
167 void generate_serialize_ipaddr_to_buffer(ofstream &out,
string name,
int error_ret);
168 void generate_serialize_uuid_t_to_buffer(ofstream &out,
string name,
int error_ret);
169 void generate_serialize_double_to_buffer(ofstream &out,
string name,
int error_ret);
171 void generate_read_buffer_memcpy(ofstream &out,
string dest,
string length,
bool ref);
172 void generate_read_buffer_memcpy_incr_offset(ofstream &out,
string dest,
string length,
bool ref);
173 void generate_read_buffer_chk_memcpy_incr_offset(ofstream &out,
string dest,
string length,
int error_ret,
bool ref);
175 void generate_struct_begin_reader_from_buffer(ofstream &out,
string name,
bool is_sandesh,
int error_ret);
176 void generate_struct_end_reader_from_buffer(ofstream &out,
bool is_sandesh);
177 void generate_field_begin_reader_from_buffer(ofstream &out,
string field_type,
string field_id,
int error_ret);
178 void generate_field_end_reader_from_buffer(ofstream &out);
179 void generate_list_begin_reader_from_buffer(ofstream &out,
string element_size,
int error_ret);
180 void generate_list_end_reader_from_buffer(ofstream &out);
182 void generate_deserialize_bool_from_buffer(ofstream &out,
string name,
int error_ret);
183 void generate_deserialize_byte_from_buffer(ofstream &out,
string name,
int error_ret);
184 void generate_deserialize_i16_from_buffer(ofstream &out,
string name,
int error_ret);
185 void generate_deserialize_i32_from_buffer(ofstream &out,
string name,
int error_ret);
186 void generate_deserialize_i64_from_buffer(ofstream &out,
string name,
int error_ret);
187 void generate_deserialize_u16_from_buffer(ofstream &out,
string name,
int error_ret);
188 void generate_deserialize_u32_from_buffer(ofstream &out,
string name,
int error_ret);
189 void generate_deserialize_u64_from_buffer(ofstream &out,
string name,
int error_ret);
190 void generate_deserialize_string_from_buffer(ofstream &out,
string name,
int error_ret);
191 void generate_deserialize_xml_from_buffer(ofstream &out,
string name,
int error_ret);
192 void generate_deserialize_ipaddr_from_buffer(ofstream &out,
string name,
int error_ret);
193 void generate_deserialize_uuid_t_from_buffer(ofstream &out,
string name,
int error_ret);
194 void generate_deserialize_double_from_buffer(ofstream &out,
string name,
int error_ret);
196 void generate_serialize_field(ofstream &out,
t_field *tfield,
string prefix,
string suffix,
int error_ret);
197 void generate_serialize_field_to_buffer(ofstream &out,
t_field *tfield,
string prefix,
string suffix,
int error_ret);
198 void generate_serialize_struct(ofstream &out,
t_struct *tstruct,
string prefix,
int error_ret);
199 void generate_serialize_struct_to_buffer(ofstream &out,
t_struct *tstruct,
string prefix,
int error_ret);
200 void generate_serialize_container(ofstream &out,
t_type *ttype,
string prefix,
int error_ret);
201 void generate_serialize_container_to_buffer(ofstream &out,
t_type *ttype,
string prefix,
int error_ret);
202 void generate_serialize_list_element(ofstream &out,
t_list *tlist,
string list,
string index,
int error_ret);
203 void generate_serialize_list_element_to_buffer(ofstream &out,
t_list *tlist,
string list,
string index,
int error_ret);
205 void generate_deserialize_field(ofstream &out,
t_field *tfield,
string prefix,
string suffix,
int error_ret);
206 void generate_deserialize_field_from_buffer(ofstream &out,
t_field *tfield,
string prefix,
string suffix,
int error_ret);
207 void generate_deserialize_struct(ofstream &out,
t_struct *tstruct,
string prefix,
int error_ret);
208 void generate_deserialize_struct_from_buffer(ofstream &out,
t_struct *tstruct,
string prefix,
int error_ret);
209 void generate_deserialize_container(ofstream &out,
t_type *ttype,
string prefix,
int error_ret);
210 void generate_deserialize_container_from_buffer(ofstream &out,
t_type *ttype,
string prefix,
int error_ret);
211 void generate_deserialize_list_element(ofstream &out,
t_list *tlist,
string prefix,
string index,
int error_ret);
212 void generate_deserialize_list_element_from_buffer(ofstream &out,
t_list *tlist,
string prefix,
string index,
int error_ret);
221 MKDIR(get_out_dir().c_str());
228 string f_types_name = get_out_dir() + this->nspace_lc
229 + program_name_lc +
"_types.h";
230 f_types_.open(f_types_name.c_str());
231 string f_types_impl_name = get_out_dir() + this->nspace_lc
232 + program_name_lc +
"_types.c";
233 f_types_impl_.open(f_types_impl_name.c_str());
236 f_types_ << autogen_comment();
237 f_types_impl_ << autogen_comment();
241 "#ifndef " << this->nspace_uc << program_name_uc <<
"_TYPES_H" << endl <<
242 "#define " << this->nspace_uc << program_name_uc <<
"_TYPES_H" << endl <<
247 "#ifdef __cplusplus" << endl <<
248 "extern \"C\" {" << endl <<
254 "/* base includes */" << endl <<
255 "#include \"sandesh/library/c/sandesh.h\"" << endl;
258 const vector<t_program *> &includes = program_->get_includes();
259 for (
size_t i = 0; i < includes.size(); ++i) {
261 "/* other thrift includes */" << endl <<
262 "#include \"" << this->nspace_lc << includes[i]->get_name() <<
263 "_types.h\"" << endl;
268 const vector<string> &c_includes = program_->get_c_includes();
269 f_types_ <<
"/* custom thrift includes */" << endl;
270 for (
size_t i = 0; i < c_includes.size(); ++i) {
271 if (c_includes[i][0] ==
'<') {
273 "#include " << c_includes[i] << endl;
276 "#include \"" << c_includes[i] <<
"\"" << endl;
284 "#include \"" << this->nspace_lc << program_name_u <<
285 "_types.h\"" << endl <<
289 "/* begin types */" << endl << endl;
301 "#ifdef __cplusplus" << endl <<
308 "#endif /* " << this->nspace_uc << program_name_uc <<
"_TYPES_H */" << endl;
312 f_types_impl_.close();
326 indent() <<
"typedef " << type_name(ttypedef->
get_type(),
true) <<
327 " " << this->nspace << ttypedef->
get_symbolic() <<
";" << endl <<
352 indent() <<
"enum _" << this->nspace << name <<
" {" << endl;
357 vector<t_enum_value *>::iterator c_iter;
361 for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
365 f_types_ <<
"," << endl;
369 indent() << this->nspace_uc << name_uc <<
"_" << (*c_iter)->get_name();
370 if ((*c_iter)->has_value()) {
372 " = " << (*c_iter)->get_value();
380 "typedef enum _" << this->nspace << name <<
" " << this->nspace << name <<
";" << endl <<
388 f_types_ <<
"/* constants */" << endl;
389 f_types_impl_ <<
"/* constants */" << endl;
391 vector<t_const *>::iterator c_iter;
392 for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
393 string name = (*c_iter)->get_name();
400 indent() <<
"#define " << this->nspace_uc << name_uc <<
" " <<
401 constant_value (name_lc, type, value) << endl;
403 generate_const_initializer (name_lc, type, value);
407 f_types_impl_ << endl;
430 f_types_ <<
"/* struct " << tstruct->
get_name() <<
" */" << endl;
431 generate_object(tstruct);
438 f_types_ <<
"/* sandesh " << tsandesh->
get_name() <<
" */" << endl;
439 generate_object(tsandesh);
448 ofstream &out = f_types_impl_;
450 "static sandesh_info_t " << program_name_lc <<
"_infos[] = {" << endl;
451 vector<t_sandesh*> sandeshs = program_->get_sandeshs();
452 vector<t_sandesh*>::iterator s_iter;
454 for (s_iter = sandeshs.begin(); s_iter != sandeshs.end(); ++s_iter) {
455 string sandesh_name = get_sandesh_name(*s_iter);
457 out << indent() <<
"{" << endl;
460 indent() <<
".name = \"" << sandesh_name <<
"\"," << endl <<
461 indent() <<
".size = sizeof(" << sandesh_name <<
")," << endl <<
462 indent() <<
".read = " << sandesh_name_u <<
"_read," << endl <<
463 indent() <<
".read_binary_from_buffer = " << sandesh_name_u <<
"_read_binary_from_buffer," << endl <<
464 indent() <<
".write = " << sandesh_name_u <<
"_write," << endl <<
465 indent() <<
".write_binary_to_buffer = " << sandesh_name_u <<
"_write_binary_to_buffer," << endl <<
466 indent() <<
".process = " << sandesh_name_u <<
"_process," << endl <<
467 indent() <<
".free = " << sandesh_name_u <<
"_free," << endl;
469 out << indent() <<
"}," << endl;
472 out << indent() <<
"{" << endl;
475 indent() <<
".name = NULL," << endl <<
476 indent() <<
".size = 0," << endl <<
477 indent() <<
".read = NULL," << endl <<
478 indent() <<
".read_binary_from_buffer = NULL," << endl <<
479 indent() <<
".write = NULL," << endl <<
480 indent() <<
".write_binary_to_buffer = NULL," << endl <<
481 indent() <<
".process = NULL," << endl <<
482 indent() <<
".free = NULL," << endl;
484 out << indent() <<
"}, " << endl;
486 out <<
"};" << endl << endl;
489 out <<
"sandesh_info_t *" << endl
490 << program_name_lc <<
491 "_find_sandesh_info (const char *sname)" << endl;
494 out << indent() <<
"return sandesh_find_info(" << program_name_lc <<
495 "_infos, sname);" << endl;
497 out <<
"}" << endl << endl;
501 "sandesh_info_t * " << program_name_lc <<
502 "_find_sandesh_info(const char *sname);" << endl;
528 ttype = get_true_type (ttype);
537 == t_base_type::TYPE_XML));
547 string bname = base_type_name ((
t_base_type *) ttype);
550 return "const " + bname;
562 }
else if (ttype->
is_map()) {
563 throw "compiler error: no C support for map";
564 }
else if (ttype->
is_set()) {
565 throw "compiler error: no C support for set";
569 cname = base_type_name((
t_base_type *) etype) +
" *";
571 cname = type_name(etype, in_typedef, is_const);
576 return "const " + cname;
583 string pname = this->nspace + ttype->
get_name();
585 if (is_complex_type (ttype)) {
590 return "const " + pname;
611 case t_base_type::TYPE_XML:
623 case t_base_type::TYPE_U16:
625 case t_base_type::TYPE_U32:
627 case t_base_type::TYPE_U64:
631 case t_base_type::TYPE_IPV4:
633 case t_base_type::TYPE_IPADDR:
635 case t_base_type::TYPE_UUID:
638 throw "compiler error: no C base type name for base type "
648 type = get_true_type (type);
655 throw "NO T_VOID CONSTRUCT";
657 case t_base_type::TYPE_STATIC_CONST_STRING:
658 case t_base_type::TYPE_SANDESH_SYSTEM:
659 case t_base_type::TYPE_SANDESH_REQUEST:
660 case t_base_type::TYPE_SANDESH_RESPONSE:
661 case t_base_type::TYPE_SANDESH_TRACE:
662 case t_base_type::TYPE_SANDESH_TRACE_OBJECT:
663 case t_base_type::TYPE_SANDESH_BUFFER:
664 case t_base_type::TYPE_SANDESH_UVE:
665 case t_base_type::TYPE_SANDESH_OBJECT:
666 case t_base_type::TYPE_SANDESH_FLOW:
678 case t_base_type::TYPE_U16:
680 case t_base_type::TYPE_U32:
682 case t_base_type::TYPE_U64:
684 case t_base_type::TYPE_XML:
688 case t_base_type::TYPE_IPV4:
690 case t_base_type::TYPE_IPADDR:
692 case t_base_type::TYPE_UUID:
701 }
else if (type->
is_map()) {
703 }
else if (type->
is_set()) {
709 throw "INVALID TYPE IN type_to_enum: " + type->
get_name();
717 ostringstream render;
724 case t_base_type::TYPE_XML:
734 case t_base_type::TYPE_U16:
735 case t_base_type::TYPE_U32:
736 case t_base_type::TYPE_U64:
737 case t_base_type::TYPE_IPV4:
740 case t_base_type::TYPE_UUID:
751 throw "compiler error: no const of base type "
755 render <<
"(" << type_name (type) <<
")" << value->
get_integer();
758 render <<
"(" << this->nspace_lc <<
761 render <<
"NULL /* not supported */";
776 const vector<t_field*>& fields = tstruct->
get_members();
777 vector<t_field*>::const_iterator f_iter;
779 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
785 result += type_name((*f_iter)->get_type(),
false,
true) +
" " +
786 (*f_iter)->get_name();
803 result += type_name(tfield->
get_type());
824 case t_base_type::TYPE_U16:
825 case t_base_type::TYPE_U32:
826 case t_base_type::TYPE_U64:
827 case t_base_type::TYPE_IPV4:
831 result +=
" = (gdouble) 0";
834 case t_base_type::TYPE_XML:
837 case t_base_type::TYPE_UUID:
841 throw "compiler error: no C intializer for base type "
845 result +=
" = (" + type_name (type) +
") 0";
866 throw "compiler error: no support for const struct or exception";
868 throw "compiler error: no support for const array";
869 }
else if (type->
is_set()) {
870 throw "compiler error: no support for const set";
871 }
else if (type->
is_map()) {
872 throw "compiler error: no support for const map";
895 generate_object_internal(name, tsandesh->
get_members(),
true);
903 generate_object_internal(name, tstruct->
get_members(),
false);
910 const vector<t_field *> &members,
914 string dtname = is_sandesh ?
"void" : name;
915 string dvname = is_sandesh ?
"sandesh" : name_u;
919 "struct _" << this->nspace << name << endl <<
921 " /* public */" << endl;
924 vector<t_field *>::const_iterator m_iter;
925 for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
927 if ((*m_iter)->get_auto_generated()) {
930 t_type *t = get_true_type ((*m_iter)->get_type());
932 " " << type_name (t) <<
" " << (*m_iter)->
get_name() <<
";" << endl;
935 f_types_ <<
" " <<
"u_int32_t " << (*m_iter)->get_name() <<
"_size;"
940 " u_int8_t __isset_" << (*m_iter)->get_name() <<
";" << endl;
947 "typedef struct _" << this->nspace << name <<
" " <<
948 this->nspace << name <<
";" << endl <<
954 this->nspace_lc << name_u <<
955 "_write (" << dtname <<
956 "* w" << dvname <<
", ThriftProtocol *protocol, int *error);" << endl;
959 this->nspace_lc << name_u <<
960 "_write_binary_to_buffer (" << dtname <<
961 "* w" << dvname <<
", uint8_t *buf, const size_t buf_len, int *error);" << endl;
964 this->nspace_lc << name_u <<
965 "_read (" << dtname <<
966 "* r" << dvname <<
", ThriftProtocol *protocol, int *error);" << endl;
969 this->nspace_lc << name_u <<
970 "_read_binary_from_buffer (" << dtname <<
971 "* r" << dvname <<
", uint8_t *buf, const size_t buf_len, int *error);" << endl;
974 this->nspace_lc << name_u <<
975 "_free(" << dtname <<
976 "* f" << dvname <<
");" << endl;
980 this->nspace_lc << name_u <<
981 "_process (void *p" << name_u <<
");" << endl;
986 generate_struct_reader (f_types_impl_, name, members, is_sandesh);
987 generate_struct_reader_from_buffer (f_types_impl_, name, members, is_sandesh);
988 generate_struct_writer (f_types_impl_, name, members, is_sandesh);
989 generate_struct_writer_to_buffer (f_types_impl_, name, members, is_sandesh);
990 generate_struct_deleter (f_types_impl_, name, members, is_sandesh);
998 const vector<t_field *> &fields,
1002 string fname =
"f" + name_u;
1003 string sname = is_sandesh ?
"sandesh" :
"struct";
1004 string dname = is_sandesh ?
"void" : name;
1005 string dfname = is_sandesh ?
"fsandesh" : fname;
1007 vector <t_field *>::const_iterator f_iter;
1012 this->nspace_lc << name_u <<
1013 "_free (" << dname <<
1014 "* " << dfname <<
")" << endl;
1016 indent(out) <<
"{" << endl;
1020 out << indent() << name <<
"* " << fname <<
" = " <<
1021 "(" << name <<
"* ) " << dfname <<
";" <<
1027 indent() <<
"/* satisfy -Wall in case these aren't used */" << endl <<
1028 indent() <<
"THRIFT_UNUSED_VAR (" << fname <<
");" << endl;
1030 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1032 if ((*f_iter)->get_auto_generated()) {
1035 t_type *
type = get_true_type ((*f_iter)->get_type());
1036 string fvname = fname +
"->" + (*f_iter)->get_name();
1038 indent(out) <<
"if (" << fvname <<
") {" << endl;
1040 indent(out) << ((
t_struct *)type)->get_name() <<
"_free(" <<
1041 fvname <<
");" << endl;
1042 indent(out) <<
"os_free(" << fvname <<
");" << endl;
1043 indent(out) << fvname <<
" = NULL;" << endl;
1046 indent(out) <<
"if (" << fvname <<
") {" << endl;
1048 indent(out) <<
"os_free(" << fvname <<
");" << endl;
1049 indent(out) << fvname <<
"_size = 0;" << endl;
1050 indent(out) << fvname <<
" = NULL;" << endl;
1056 case t_base_type::TYPE_XML:
1057 indent(out) <<
"if (" << fvname <<
") {" << endl;
1059 indent(out) <<
"os_free(" << fvname <<
");" << endl;
1060 indent(out) << fvname <<
" = NULL;" << endl;
1079 indent() <<
"if (Xbuflen < Xoffset + " << length <<
") {" << endl <<
1080 indent() <<
" return " << error_ret <<
";" << endl <<
1081 indent() <<
"}" << endl;
1087 indent() <<
"Xoffset += " << length <<
";" << endl;
1096 indent() <<
"memcpy (Xbuf + Xoffset, &" << source <<
", " <<
1097 length <<
");" << endl;
1100 indent() <<
"memcpy (Xbuf + Xoffset, " << source <<
", " <<
1101 length <<
");" << endl;
1111 indent() <<
"memcpy (&" << dest <<
", Xbuf + Xoffset, " <<
1112 length <<
");" << endl;
1115 indent() <<
"memcpy (" << dest <<
", Xbuf + Xoffset, " <<
1116 length <<
");" << endl;
1124 generate_write_buffer_memcpy (out, source, length, ref);
1125 generate_buffer_incr_offset (out, length);
1132 generate_read_buffer_memcpy (out, dest, length, ref);
1133 generate_buffer_incr_offset (out, length);
1141 generate_buffer_bounds_chk (out, length, error_ret);
1142 generate_write_buffer_memcpy_incr_offset (out, source, length, ref);
1150 generate_buffer_bounds_chk (out, length, error_ret);
1151 generate_read_buffer_memcpy_incr_offset (out, dest, length, ref);
1155 string buf_len,
int error_ret) {
1156 string nbuf_len(tmp(
"Xnbuflen"));
1157 generate_buffer_bounds_chk (out,
"4", error_ret);
1160 indent() <<
"int32_t " << nbuf_len <<
" = htonl (" <<
1161 buf_len <<
");" << endl;
1162 generate_write_buffer_memcpy_incr_offset (out, nbuf_len,
"4",
true);
1164 generate_write_buffer_chk_memcpy_incr_offset (out, buf, buf_len, error_ret,
1174 os << name.length();
1175 string name_len(os.str());
1177 indent() <<
"/* thrift_protocol_write_sandesh_begin */" << endl;
1178 generate_write_buffer_binary (out,
"\"" + name +
"\"", name_len,
1181 out << indent() <<
"/* thrift_protocol_write_struct_begin */" << endl;
1191 indent() <<
"/* thrift_protocol_read_sandesh_begin */" << endl;
1192 generate_deserialize_string_from_buffer (out, name, error_ret);
1194 indent() <<
"if (" << name <<
") { os_free (" << name <<
"); " <<
1195 name <<
" = NULL; }" << endl << endl;
1197 out << indent() <<
"/* thrift_protocol_read_struct_begin */" << endl;
1204 out << indent() <<
"/* thrift_protocol_write_sandesh_send */" << endl;
1206 out << indent() <<
"/* thrift_protocol_write_struct_send */" << endl;
1213 out << indent() <<
"/* thrift_protocol_read_sandesh_send */" << endl;
1215 out << indent() <<
"/* thrift_protocol_read_struct_send */" << endl;
1221 string field_stop(tmp(
"Xfield_stop"));
1223 indent() <<
"/* thrift_protocol_field_stop */" << endl;
1224 generate_buffer_bounds_chk (out,
"1", error_ret);
1227 indent() <<
"int8_t " << field_stop <<
" = (int8_t) T_STOP;" << endl;
1228 generate_write_buffer_memcpy_incr_offset (out, field_stop,
"1",
true);
1234 const vector<t_field *> &fields,
1238 string wname =
"w" + name_u;
1239 string sname = is_sandesh ?
"sandesh" :
"struct";
1240 string dname = is_sandesh ?
"void" : name;
1241 string dwname = is_sandesh ?
"wsandesh" : wname;
1243 vector <t_field *>::const_iterator f_iter;
1249 "int32_t" << endl <<
1250 this->nspace_lc << name_u <<
"_write_binary_to_buffer (" <<
1251 dname <<
"* " << dwname <<
1252 ", uint8_t *Xbuf, const size_t Xbuflen, int *Xerror)" << endl;
1254 indent(out) <<
"{" << endl;
1258 indent() <<
"int32_t Xret;" << endl <<
1259 indent() <<
"int32_t Xoffset = 0;" << endl <<
1260 indent() <<
"u_int32_t Xi;" << endl <<
1264 out << indent() << name <<
"* " << wname <<
" = " <<
1265 "(" << name <<
"* ) " << dwname <<
";" <<
1271 indent() <<
"/* satisfy -Wall in case these aren't used */" << endl <<
1272 indent() <<
"THRIFT_UNUSED_VAR (Xret);" << endl <<
1273 indent() <<
"THRIFT_UNUSED_VAR (Xi);" << endl <<
1274 indent() <<
"THRIFT_UNUSED_VAR (" << wname <<
");" << endl;
1278 generate_struct_begin_writer_to_buffer(out, name, is_sandesh, error_ret);
1280 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1282 if ((*f_iter)->get_auto_generated()) {
1286 indent(out) <<
"if (" << wname <<
"->__isset_" << (*f_iter)->get_name() <<
" == 1) {" << endl;
1289 ostringstream key_os;
1290 key_os << (*f_iter)->get_key();
1291 string key(key_os.str());
1292 string tenum(type_to_enum((*f_iter)->get_type()));
1293 generate_field_begin_writer_to_buffer (out, key, tenum, error_ret);
1294 generate_serialize_field_to_buffer (out, *f_iter, wname +
"->",
"", error_ret);
1295 generate_field_end_writer_to_buffer (out);
1297 indent(out) <<
"if (" << wname <<
"->__isset_" << (*f_iter)->get_name() <<
" == 1) {" << endl;
1301 generate_field_stop_writer_to_buffer(out, error_ret);
1302 generate_struct_end_writer_to_buffer(out, is_sandesh);
1304 indent(out) <<
"return Xoffset;" << endl;
1318 const vector<t_field *> &fields,
1322 string wname =
"w" + name_u;
1323 string sname = is_sandesh ?
"sandesh" :
"struct";
1324 string dname = is_sandesh ?
"void" : name;
1325 string dwname = is_sandesh ?
"wsandesh" : wname;
1327 vector <t_field *>::const_iterator f_iter;
1333 "int32_t" << endl <<
1334 this->nspace_lc << name_u <<
1335 "_write (" << dname <<
1336 "* " << dwname <<
", ThriftProtocol *protocol, int *error)" << endl;
1338 indent(out) <<
"{" << endl;
1342 indent() <<
"int32_t ret;" << endl <<
1343 indent() <<
"int32_t xfer = 0;" << endl <<
1344 indent() <<
"u_int32_t i;" << endl <<
1348 out << indent() << name <<
"* " << wname <<
" = " <<
1349 "(" << name <<
"* ) " << dwname <<
";" <<
1355 indent() <<
"/* satisfy -Wall in case these aren't used */" << endl <<
1356 indent() <<
"THRIFT_UNUSED_VAR (i);" << endl <<
1357 indent() <<
"THRIFT_UNUSED_VAR (" << wname <<
");" << endl;
1362 indent() <<
"if ((ret = thrift_protocol_write_" << sname <<
"_begin (protocol, \"" << name <<
"\", error)) < 0)" << endl <<
1363 indent() <<
" return " << error_ret <<
";" << endl <<
1364 indent() <<
"xfer += ret;" << endl;
1366 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1368 if ((*f_iter)->get_auto_generated()) {
1372 indent(out) <<
"if (" << wname <<
"->__isset_" << (*f_iter)->get_name() <<
" == 1) {" << endl;
1377 indent() <<
"if ((ret = thrift_protocol_write_field_begin (protocol, " <<
1378 "\"" << (*f_iter)->get_name() <<
"\", " <<
1379 type_to_enum ((*f_iter)->get_type()) <<
", " <<
1380 (*f_iter)->get_key() <<
", error)) < 0)" << endl <<
1381 indent() <<
" return " << error_ret <<
";" << endl <<
1382 indent() <<
"xfer += ret;" << endl;
1383 generate_serialize_field (out, *f_iter, wname +
"->",
"", error_ret);
1385 indent() <<
"xfer += ret;" << endl;
1387 indent() <<
"if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0)" << endl <<
1388 indent() <<
" return " << error_ret <<
";" << endl <<
1389 indent() <<
"xfer += ret;" << endl;
1393 indent(out) <<
"}" << endl;
1399 indent() <<
"if ((ret = thrift_protocol_write_field_stop (protocol, error)) < 0)" << endl <<
1400 indent() <<
" return " << error_ret <<
";" << endl <<
1401 indent() <<
"xfer += ret;" << endl <<
1402 indent() <<
"if ((ret = thrift_protocol_write_" << sname <<
"_end (protocol, error)) < 0)" << endl <<
1403 indent() <<
" return " << error_ret <<
";" << endl <<
1404 indent() <<
"xfer += ret;" << endl <<
1408 indent(out) <<
"return xfer;" << endl;
1422 const vector <t_field *> &fields,
1426 string rname =
"r" + name_u;
1428 vector <t_field *>::const_iterator f_iter;
1429 string sname = is_sandesh ?
"sandesh" :
"struct";
1430 string dname = is_sandesh ?
"void" : name;
1431 string drname = is_sandesh ?
"rsandesh" : rname;
1436 "/* reads a " << name_u <<
" " << sname <<
" */" << endl <<
1437 "int32_t" << endl <<
1438 this->nspace_lc << name_u <<
1439 "_read (" << dname <<
1440 " *" << drname <<
", ThriftProtocol *protocol, int *error)" << endl;
1443 indent(out) <<
"{" << endl;
1448 indent() <<
"int32_t ret;" << endl <<
1449 indent() <<
"int32_t xfer = 0;" << endl <<
1450 indent() <<
"char *name;" << endl <<
1451 indent() <<
"ThriftType ftype;" << endl <<
1452 indent() <<
"int16_t fid;" << endl <<
1453 indent() <<
"u_int32_t len = 0, i;" << endl <<
1454 indent() <<
"void *data = NULL;" << endl;
1457 out << indent() << name <<
"* " << rname <<
" = " <<
1458 "(" << name <<
"* ) " << drname <<
";" << endl;
1461 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1463 if ((*f_iter)->get_auto_generated()) {
1467 indent(out) <<
"u_int8_t isset_" << (*f_iter)->get_name() <<
" = 0;" << endl;
1473 indent() <<
"/* satisfy -Wall in case these aren't used */" << endl <<
1474 indent() <<
"THRIFT_UNUSED_VAR (len);" << endl <<
1475 indent() <<
"THRIFT_UNUSED_VAR (data);" << endl <<
1476 indent() <<
"THRIFT_UNUSED_VAR (i);" << endl <<
1477 indent() <<
"THRIFT_UNUSED_VAR (" << rname <<
");" << endl;
1483 indent() <<
"/* read the " << sname <<
" begin marker */" << endl <<
1484 indent() <<
"if ((ret = thrift_protocol_read_" << sname <<
"_begin (protocol, &name, error)) < 0)" << endl <<
1485 indent() <<
"{" << endl <<
1486 indent() <<
" if (name) os_free (name);" << endl <<
1487 indent() <<
" return " << error_ret <<
";" << endl <<
1488 indent() <<
"}" << endl <<
1489 indent() <<
"xfer += ret;" << endl <<
1490 indent() <<
"if (name) { os_free (name); name = NULL; }" << endl <<
1495 indent() <<
"/* read the struct fields */" << endl <<
1496 indent() <<
"while (1)" << endl;
1501 indent() <<
"/* read the beginning of a field */" << endl <<
1502 indent() <<
"if ((ret = thrift_protocol_read_field_begin (protocol, &name, &ftype, &fid, error)) < 0)" << endl <<
1503 indent() <<
"{" << endl <<
1504 indent() <<
" if (name) os_free (name);" << endl <<
1505 indent() <<
" return " << error_ret <<
";" << endl <<
1506 indent() <<
"}" << endl <<
1507 indent() <<
"xfer += ret;" << endl <<
1508 indent() <<
"if (name) { os_free (name); name = NULL; }" << endl <<
1513 indent() <<
"/* break if we get a STOP field */" << endl <<
1514 indent() <<
"if (ftype == T_STOP)" << endl <<
1515 indent() <<
"{" << endl <<
1516 indent() <<
" break;" << endl <<
1517 indent() <<
"}" << endl <<
1522 "switch (fid)" << endl;
1528 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1530 if ((*f_iter)->get_auto_generated()) {
1534 "case " << (*f_iter)->get_key() <<
":" << endl;
1537 "if (ftype == " << type_to_enum ((*f_iter)->get_type()) <<
")" << endl;
1544 generate_deserialize_field (out, *f_iter, rname +
"->",
"", error_ret);
1548 indent() <<
"} else {" << endl <<
1549 indent() <<
" if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl <<
1550 indent() <<
" return " << error_ret <<
";" << endl <<
1551 indent() <<
" xfer += ret;" << endl <<
1552 indent() <<
"}" << endl <<
1553 indent() <<
"break;" << endl;
1559 indent() <<
"default:" << endl <<
1560 indent() <<
" if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl <<
1561 indent() <<
" return " << error_ret <<
";" << endl <<
1562 indent() <<
" xfer += ret;" << endl <<
1563 indent() <<
" break;" << endl;
1570 indent() <<
"if ((ret = thrift_protocol_read_field_end (protocol, error)) < 0)" << endl <<
1571 indent() <<
" return " << error_ret <<
";" << endl <<
1572 indent() <<
"xfer += ret;" << endl;
1580 indent() <<
"if ((ret = thrift_protocol_read_" << sname <<
"_end (protocol, error)) < 0)" << endl <<
1581 indent() <<
" return " << error_ret <<
";" << endl <<
1582 indent() <<
"xfer += ret;" << endl <<
1586 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1588 if ((*f_iter)->get_auto_generated()) {
1593 indent() <<
"if (!isset_" << (*f_iter)->get_name() <<
")" << endl <<
1594 indent() <<
"{" << endl <<
1595 indent() <<
" *error = THRIFT_PROTOCOL_ERROR_INVALID_DATA;" << endl <<
1596 indent() <<
" syslog(LOG_ERROR, \"THRIFT_PROTOCOL_ERROR: missing field\");" << endl <<
1597 indent() <<
" return -1;" << endl <<
1598 indent() <<
"}" << endl <<
1605 "return xfer;" << endl;
1620 const vector <t_field *> &fields,
1624 string rname =
"r" + name_u;
1626 vector <t_field *>::const_iterator f_iter;
1627 string sname = is_sandesh ?
"sandesh" :
"struct";
1628 string dname = is_sandesh ?
"void" : name;
1629 string drname = is_sandesh ?
"rsandesh" : rname;
1634 "/* reads a " << name_u <<
" " << sname <<
" */" << endl <<
1635 "int32_t" << endl <<
1636 this->nspace_lc << name_u <<
1637 "_read_binary_from_buffer (" << dname <<
1638 " *" << drname <<
", uint8_t *Xbuf, const size_t Xbuflen, int *Xerror)" << endl;
1641 indent(out) <<
"{" << endl;
1646 indent() <<
"int32_t Xret;" << endl <<
1647 indent() <<
"int32_t Xoffset = 0;" << endl <<
1648 indent() <<
"char *Xname;" << endl <<
1649 indent() <<
"ThriftType Xftype;" << endl <<
1650 indent() <<
"int16_t Xfid;" << endl <<
1651 indent() <<
"u_int32_t Xi;" << endl;
1654 out << indent() << name <<
"* " << rname <<
" = " <<
1655 "(" << name <<
"* ) " << drname <<
";" << endl;
1658 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1660 if ((*f_iter)->get_auto_generated()) {
1664 indent(out) <<
"u_int8_t isset_" << (*f_iter)->get_name() <<
" = 0;" << endl;
1670 indent() <<
"/* satisfy -Wall in case these aren't used */" << endl <<
1671 indent() <<
"THRIFT_UNUSED_VAR (Xret);" << endl <<
1672 indent() <<
"THRIFT_UNUSED_VAR (Xname);" << endl <<
1673 indent() <<
"THRIFT_UNUSED_VAR (Xi);" << endl <<
1674 indent() <<
"THRIFT_UNUSED_VAR (" << rname <<
");" << endl;
1680 indent() <<
"/* read the " << sname <<
" begin marker */" << endl;
1681 generate_struct_begin_reader_from_buffer (out,
"Xname", is_sandesh, error_ret);
1685 indent() <<
"/* read the struct fields */" << endl <<
1686 indent() <<
"while (1)" << endl;
1691 indent() <<
"/* read the beginning of a field */" << endl;
1692 generate_field_begin_reader_from_buffer (out,
"Xftype",
"Xfid", error_ret);
1697 "switch (Xfid)" << endl;
1703 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1705 if ((*f_iter)->get_auto_generated()) {
1709 "case " << (*f_iter)->get_key() <<
":" << endl;
1712 "if (Xftype == " << type_to_enum ((*f_iter)->get_type()) <<
")" << endl;
1719 generate_deserialize_field_from_buffer (out, *f_iter, rname +
"->",
"", error_ret);
1723 indent() <<
"} else {" << endl <<
1724 indent() <<
" if ((Xret = thrift_binary_protocol_skip_from_buffer (Xbuf + Xoffset, Xbuflen - Xoffset, Xftype, Xerror)) < 0)" << endl <<
1725 indent() <<
" return " << error_ret <<
";" << endl <<
1726 indent() <<
" Xoffset += Xret;" << endl <<
1727 indent() <<
"}" << endl <<
1728 indent() <<
"break;" << endl;
1734 indent() <<
"default:" << endl <<
1735 indent() <<
" if ((Xret = thrift_binary_protocol_skip_from_buffer (Xbuf + Xoffset, Xbuflen - Xoffset, Xftype, Xerror)) < 0)" << endl <<
1736 indent() <<
" return " << error_ret <<
";" << endl <<
1737 indent() <<
" Xoffset += Xret;" << endl <<
1738 indent() <<
" break;" << endl;
1744 generate_field_end_reader_from_buffer (out);
1751 generate_struct_end_reader_from_buffer (out, is_sandesh);
1754 for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1756 if ((*f_iter)->get_auto_generated()) {
1761 indent() <<
"if (!isset_" << (*f_iter)->get_name() <<
")" << endl <<
1762 indent() <<
"{" << endl <<
1763 indent() <<
" *error = THRIFT_PROTOCOL_ERROR_INVALID_DATA;" << endl <<
1764 indent() <<
" syslog(LOG_ERROR, \"THRIFT_PROTOCOL_ERROR: missing field\");" << endl <<
1765 indent() <<
" return -1;" << endl <<
1766 indent() <<
"}" << endl <<
1773 "return Xoffset;" << endl;
1788 indent() <<
"/* thrift_protocol_write_field_begin */" << endl;
1789 generate_buffer_bounds_chk (out,
"1", error_ret);
1790 string field_type8(tmp(
"Xfield_type8"));
1793 indent() <<
"int8_t " << field_type8 <<
" = (int8_t) " <<
1794 field_type <<
";" << endl;
1795 generate_write_buffer_memcpy_incr_offset (out, field_type8,
1798 generate_buffer_bounds_chk (out,
"2", error_ret);
1799 string nkey(tmp(
"Xnfield_id"));
1802 indent() <<
"int16_t " << nkey <<
" = htons (" << key <<
");" << endl;
1803 generate_write_buffer_memcpy_incr_offset (out, nkey,
"2",
true);
1813 indent() <<
"/* thrift_protocol_read_field_begin */" << endl;
1814 generate_deserialize_byte_from_buffer (out, field_type, error_ret);
1817 indent() <<
"/* break if we get a STOP field */" << endl <<
1818 indent() <<
"if (" << field_type <<
" == T_STOP)" << endl <<
1819 indent() <<
"{" << endl <<
1820 indent() <<
" break;" << endl <<
1821 indent() <<
"}" << endl;
1823 indent() <<
" else" << endl;
1825 generate_deserialize_i16_from_buffer (out, field_id, error_ret);
1831 indent() <<
"/* thrift_protocol_write_field_end */" << endl;
1836 indent() <<
"/* thrift_protocol_read_field_end */" << endl;
1842 string nbool(tmp(
"Xbool"));
1844 indent() <<
"/* thrift_protocol_write_bool */" << endl;
1847 indent() <<
"uint8_t " << nbool <<
" = " << name <<
" ? 1 : 0;" << endl;
1848 generate_serialize_byte_to_buffer (out, nbool, error_ret);
1856 indent() <<
"/* thrift_protocol_read_bool */" << endl;
1858 out << indent() <<
"void * b[1];" << endl;
1859 generate_read_buffer_chk_memcpy_incr_offset (out,
"b",
"1", error_ret,
1862 indent() << name <<
" = *(int8_t *) b != 0;" << endl;
1870 indent() <<
"/* thrift_protocol_write_byte */" << endl;
1871 generate_write_buffer_chk_memcpy_incr_offset (out, name,
"1", error_ret,
1879 indent() <<
"/* thrift_protocol_read_byte */" << endl;
1881 out << indent() <<
"void * b[1];" << endl;
1882 generate_read_buffer_chk_memcpy_incr_offset (out,
"b",
"1", error_ret,
1885 indent() << name <<
" = *(int8_t *) b;" << endl;
1892 string ni16(tmp(
"Xni16"));
1893 out << indent() <<
"/* thrift_protocol_write_i16 */" << endl;
1896 indent() <<
"int16_t " << ni16 <<
" = htons (" << name <<
");" << endl;
1897 generate_write_buffer_chk_memcpy_incr_offset (out, ni16,
"2", error_ret,
1905 out << indent() <<
"/* thrift_protocol_read_i16 */" << endl;
1908 indent() <<
"union {"<< endl <<
1909 indent() <<
" void * b[2];" << endl <<
1910 indent() <<
" int16_t all;" << endl <<
1911 indent() <<
"} bytes;" << endl;
1912 generate_read_buffer_chk_memcpy_incr_offset (out,
"bytes.b",
"2", error_ret,
1915 indent() << name <<
" = ntohs (bytes.all);" << endl;
1922 string nu16(tmp(
"Xnu16"));
1923 out << indent() <<
"/* thrift_protocol_write_u16 */" << endl;
1926 indent() <<
"uint16_t " << nu16 <<
" = htons (" << name <<
");" << endl;
1927 generate_write_buffer_chk_memcpy_incr_offset (out, nu16,
"2", error_ret,
1935 out << indent() <<
"/* thrift_protocol_read_u16 */" << endl;
1938 indent() <<
"union {"<< endl <<
1939 indent() <<
" void * b[2];" << endl <<
1940 indent() <<
" uint16_t all;" << endl <<
1941 indent() <<
"} bytes;" << endl;
1942 generate_read_buffer_chk_memcpy_incr_offset (out,
"bytes.b",
"2", error_ret,
1945 indent() << name <<
" = ntohs (bytes.all);" << endl;
1952 string ni32(tmp(
"Xni32"));
1953 out << indent() <<
"/* thrift_protocol_write_i32 */" << endl;
1956 indent() <<
"int32_t " << ni32 <<
" = htonl (" << name <<
");" << endl;
1957 generate_write_buffer_chk_memcpy_incr_offset (out, ni32,
"4", error_ret,
1965 out << indent() <<
"/* thrift_protocol_read_i32 */" << endl;
1968 indent() <<
"union {"<< endl <<
1969 indent() <<
" void * b[4];" << endl <<
1970 indent() <<
" int32_t all;" << endl <<
1971 indent() <<
"} bytes;" << endl;
1972 generate_read_buffer_chk_memcpy_incr_offset (out,
"bytes.b",
"4", error_ret,
1975 indent() << name <<
" = ntohl (bytes.all);" << endl;
1982 string nu32(tmp(
"Xnu32"));
1983 out << indent() <<
"/* thrift_protocol_write_u32 */" << endl;
1986 indent() <<
"uint32_t " << nu32 <<
" = htonl (" << name <<
");" << endl;
1987 generate_write_buffer_chk_memcpy_incr_offset (out, nu32,
"4", error_ret,
1995 out << indent() <<
"/* thrift_protocol_read_u32 */" << endl;
1998 indent() <<
"union {"<< endl <<
1999 indent() <<
" void * b[4];" << endl <<
2000 indent() <<
" uint32_t all;" << endl <<
2001 indent() <<
"} bytes;" << endl;
2002 generate_read_buffer_chk_memcpy_incr_offset (out,
"bytes.b",
"4", error_ret,
2005 indent() << name <<
" = ntohl (bytes.all);" << endl;
2012 string ni64(tmp(
"Xni64"));
2013 out << indent() <<
"/* thrift_protocol_write_i64 */" << endl;
2016 indent() <<
"int64_t " << ni64 <<
";" << endl <<
2017 indent() <<
"os_put_value64((uint8_t *)&" << ni64 <<
", " << name <<
2019 generate_write_buffer_chk_memcpy_incr_offset (out, ni64,
"8", error_ret,
2027 out << indent() <<
"/* thrift_protocol_read_i64 */" << endl;
2030 indent() <<
"void * b[8];" << endl;
2031 generate_read_buffer_chk_memcpy_incr_offset (out,
"b",
"8", error_ret,
2034 indent() << name <<
" = os_get_value64((uint8_t *)b);" << endl;
2041 string nu64(tmp(
"Xnu64"));
2042 out << indent() <<
"/* thrift_protocol_write_u64 */" << endl;
2045 indent() <<
"uint64_t " << nu64 <<
";" << endl <<
2046 indent() <<
"os_put_value64((uint8_t *)&" << nu64 <<
", " << name <<
2048 generate_write_buffer_chk_memcpy_incr_offset (out, nu64,
"8", error_ret,
2056 out << indent() <<
"/* thrift_protocol_read_u64 */" << endl;
2059 indent() <<
"void * b[8];" << endl;
2060 generate_read_buffer_chk_memcpy_incr_offset (out,
"b",
"8", error_ret,
2063 indent() << name <<
" = os_get_value64((uint8_t *)b);" << endl;
2070 generate_serialize_string_to_buffer(out, name, error_ret);
2076 generate_deserialize_string_from_buffer(out, name, error_ret);
2082 string s_strlen(tmp(
"Xsstrlen"));
2083 out << indent() <<
"/* thrift_protocol_write_string */" << endl;
2086 indent() <<
"int32_t " << s_strlen <<
" = " << name <<
2087 " != NULL ? strlen (" << name <<
") : 0;" << endl;
2088 generate_write_buffer_binary (out, name, s_strlen, error_ret);
2095 string s_strlen(tmp(
"Xread_len"));
2096 out << indent() <<
"/* thrift_protocol_read_string */" << endl;
2099 indent() <<
"int32_t " << s_strlen <<
" = 0;" << endl;
2100 generate_deserialize_i32_from_buffer (out, s_strlen, error_ret);
2102 indent() <<
"if (" << s_strlen <<
" > 0)" << endl;
2105 indent() <<
"if (Xbuflen < Xoffset + " << s_strlen <<
") {" << endl <<
2106 indent() <<
" return " << error_ret <<
";" << endl <<
2107 indent() <<
"}" << endl <<
2108 indent() << name <<
" = os_malloc (" << s_strlen <<
" + 1);" << endl;
2109 generate_read_buffer_memcpy_incr_offset (out, name, s_strlen,
false);
2111 indent() << name <<
"[" << s_strlen <<
"] = 0;" << endl;
2114 indent() <<
" else" << endl;
2117 indent() << name <<
" = NULL;" << endl;
2126 indent() <<
"/* thrift_protocol_write_ipaddr */" << endl;
2127 string iptype(name +
".iptype");
2129 indent() <<
"if (" << iptype <<
" == AF_INET)" << endl;
2131 generate_write_buffer_chk_memcpy_incr_offset (out, iptype,
"1", error_ret,
2133 string ipv4(name +
".ipv4");
2134 generate_write_buffer_chk_memcpy_incr_offset (out, ipv4,
"4", error_ret,
2138 indent() <<
" else if (" << iptype <<
" == AF_INET6)" << endl;
2140 generate_write_buffer_chk_memcpy_incr_offset (out, iptype,
"1", error_ret,
2142 string ipv6(name +
".ipv6");
2143 generate_write_buffer_chk_memcpy_incr_offset (out, ipv6,
"16", error_ret,
2147 indent() <<
" else" << endl;
2150 indent() <<
"return -1;" << endl;
2158 indent() <<
"/* thrift_protocol_read_ipaddr */" << endl;
2159 string iptype(name +
".iptype");
2160 generate_deserialize_byte_from_buffer (out, iptype, error_ret);
2162 indent() <<
"if (" << iptype <<
" == AF_INET)" << endl;
2164 string ipv4(name +
".ipv4");
2165 generate_read_buffer_chk_memcpy_incr_offset (out, ipv4,
"4", error_ret,
2169 indent() <<
"else if (" << iptype <<
" == AF_INET6)" << endl;
2171 string ipv6(name +
".ipv6");
2172 generate_read_buffer_chk_memcpy_incr_offset (out, ipv6,
"16", error_ret,
2176 indent() <<
" else" << endl;
2179 indent() <<
"return -1;" << endl;
2187 indent() <<
"/* thrift_protocol_write_uuid_t */" << endl;
2188 generate_write_buffer_chk_memcpy_incr_offset (out, name,
"16", error_ret,
2196 indent() <<
"/* thrift_protocol_read_uuid_t */" << endl;
2197 generate_read_buffer_chk_memcpy_incr_offset (out, name,
"16", error_ret,
2205 indent() <<
"/* thrift_protocol_write_double */" << endl <<
2206 indent() <<
"/* NOT SUPPORTED */" << endl <<
2207 indent() <<
"return " << error_ret <<
";" << endl;
2214 indent() <<
"/* thrift_protocol_read_double */" << endl <<
2215 indent() <<
"/* NOT SUPPORTED */" << endl <<
2216 indent() <<
"return " << error_ret <<
";" << endl;
2225 string name = prefix + tfield->
get_name() + suffix;
2228 throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
2232 generate_serialize_struct (out, (
t_struct *) type, name, error_ret);
2234 generate_serialize_container (out, type, name, error_ret);
2237 "if ((ret = thrift_protocol_write_";
2243 throw "compiler error: cannot serialize void field in a struct: "
2247 out <<
"bool (protocol, " << name;
2250 out <<
"byte (protocol, " << name;
2253 out <<
"i16 (protocol, " << name;
2256 out <<
"i32 (protocol, " << name;
2259 out <<
"i64 (protocol, " << name;
2261 case t_base_type::TYPE_U16:
2262 out <<
"u16 (protocol, " << name;
2264 case t_base_type::TYPE_U32:
2265 out <<
"u32 (protocol, " << name;
2267 case t_base_type::TYPE_U64:
2268 out <<
"u64 (protocol, " << name;
2271 out <<
"double (protocol, " << name;
2273 case t_base_type::TYPE_IPV4:
2274 out <<
"ipv4 (protocol, " << name;
2276 case t_base_type::TYPE_IPADDR:
2277 out <<
"ipaddr (protocol, &" << name;
2281 throw "CANNOT GENERATE SERIALIZE CODE FOR binary TYPE: " + name;
2283 out <<
"string (protocol, " << name;
2286 case t_base_type::TYPE_XML:
2287 out <<
"xml (protocol, " << name;
2289 case t_base_type::TYPE_UUID:
2290 out <<
"uuid_t (protocol, " << name;
2293 throw "compiler error: no C writer for base type "
2297 out <<
"i32 (protocol, " << name;
2299 out <<
", error)) < 0)" << endl <<
2300 indent() <<
" return " << error_ret <<
";" << endl;
2302 printf (
"DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n",
2303 name.c_str(), type_name (type).c_str());
2313 string name = prefix + tfield->
get_name() + suffix;
2314 ostringstream key_os;
2316 string key(key_os.str());
2317 string tenum(type_to_enum(tfield->
get_type()));
2320 throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
2324 generate_serialize_struct_to_buffer (out, (
t_struct *) type, name, error_ret);
2326 generate_serialize_container_to_buffer (out, type, name, error_ret);
2332 throw "compiler error: cannot serialize void field in a struct: "
2336 generate_serialize_bool_to_buffer (out, name, error_ret);
2339 generate_serialize_byte_to_buffer (out, name, error_ret);
2342 generate_serialize_i16_to_buffer (out, name, error_ret);
2345 generate_serialize_i32_to_buffer (out, name, error_ret);
2348 generate_serialize_i64_to_buffer (out, name, error_ret);
2350 case t_base_type::TYPE_U16:
2351 generate_serialize_u16_to_buffer (out, name, error_ret);
2353 case t_base_type::TYPE_U32:
2354 generate_serialize_u32_to_buffer (out, name, error_ret);
2356 case t_base_type::TYPE_U64:
2357 generate_serialize_u64_to_buffer (out, name, error_ret);
2360 generate_serialize_double_to_buffer (out, name, error_ret);
2362 case t_base_type::TYPE_IPV4:
2363 generate_serialize_i32_to_buffer (out, name, error_ret);
2365 case t_base_type::TYPE_IPADDR:
2366 generate_serialize_ipaddr_to_buffer (out, name, error_ret);
2370 throw "CANNOT GENERATE SERIALIZE CODE FOR binary TYPE: " + name;
2372 generate_serialize_string_to_buffer (out, name, error_ret);
2375 case t_base_type::TYPE_XML:
2376 generate_serialize_xml_to_buffer (out, name, error_ret);
2378 case t_base_type::TYPE_UUID:
2379 generate_serialize_uuid_t_to_buffer (out, name, error_ret);
2382 throw "compiler error: no C writer for base type "
2386 generate_serialize_i32_to_buffer (out, name, error_ret);
2389 printf (
"DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n",
2390 name.c_str(), type_name (type).c_str());
2399 indent() <<
"if ((ret = " << tstruct->
get_name() <<
"_write (" << prefix <<
" , protocol, error)) < 0)" << endl <<
2400 indent() <<
" return " << error_ret <<
";" << endl <<
2409 indent() <<
"if ((Xret = " << tstruct->
get_name() <<
2410 "_write_binary_to_buffer (" << prefix <<
2411 ", Xbuf + Xoffset, Xbuflen - Xoffset, Xerror)) < 0)" << endl;
2413 indent() <<
" return " << error_ret <<
";" << endl <<
2414 indent() <<
"Xoffset += Xret;" << endl;
2425 throw "compiler error: serialize of map not supported in C";
2426 }
else if (ttype->
is_set()) {
2427 throw "compiler error: serialize of set not supported in C";
2428 }
else if (ttype->
is_list()) {
2429 string length = prefix +
"_size";
2431 indent() <<
"if ((ret = thrift_protocol_write_list_begin (protocol, " <<
2432 type_to_enum (((
t_list *) ttype)->get_elem_type()) <<
2433 ", " << length <<
", error)) < 0)" << endl <<
2434 indent() <<
" return " << error_ret <<
";" << endl <<
2435 indent() <<
"xfer += ret;" << endl <<
2436 indent() <<
"for (i = 0; i < " << length <<
"; i++)" << endl;
2439 generate_serialize_list_element (out, (
t_list *) ttype, prefix,
"i", error_ret);
2443 indent() <<
"if ((ret = thrift_protocol_write_list_end (protocol, error)) < 0)" << endl <<
2444 indent() <<
" return " << error_ret <<
";" << endl;
2457 throw "compiler error: serialize of map not supported in C";
2458 }
else if (ttype->
is_set()) {
2459 throw "compiler error: serialize of set not supported in C";
2460 }
else if (ttype->
is_list()) {
2461 string length = prefix +
"_size";
2462 generate_list_begin_writer_to_buffer (out,
2463 type_to_enum (((
t_list *) ttype)->get_elem_type()), length,
2466 indent() <<
"for (Xi = 0; Xi < " << length <<
"; Xi++)" << endl;
2468 generate_serialize_list_element_to_buffer (out, (
t_list *) ttype, prefix,
"Xi", error_ret);
2470 generate_list_end_writer_to_buffer (out);
2477 string element_type,
2480 string element_type8(tmp(
"Xelement_type8"));
2482 indent() <<
"/* thrift_protocol_write_list_begin */" << endl;
2483 generate_buffer_bounds_chk (out,
"1", error_ret);
2486 indent() <<
"int8_t " << element_type8 <<
" = (int8_t) " <<
2487 element_type <<
";" << endl;
2488 generate_write_buffer_memcpy_incr_offset (out, element_type8,
"1",
2491 string nelement_size(tmp(
"Xnelement_size"));
2492 generate_buffer_bounds_chk (out,
"4", error_ret);
2495 indent() <<
"uint32_t " << nelement_size <<
" = htonl (" <<
2496 length <<
");" << endl;
2497 generate_write_buffer_memcpy_incr_offset (out, nelement_size,
"4",
2505 indent() <<
"/* thrift_protocol_write_list_end */" << endl;
2515 string name = list +
"[" + index +
"]";
2517 generate_serialize_field (out, &efield,
"",
"", error_ret);
2518 out << indent() <<
"xfer += ret;" << endl;
2527 string name = list +
"[" + index +
"]";
2529 generate_serialize_field_to_buffer (out, &efield,
"",
"", error_ret);
2542 throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " +
2546 string name = prefix + tfield->
get_name() + suffix;
2549 generate_deserialize_struct (out, (
t_struct *) type, name, error_ret);
2551 generate_deserialize_container (out, type, name, error_ret);
2555 indent(out) <<
"if ((ret = thrift_protocol_read_";
2559 throw "compiler error: cannot serialize void field in a struct: " + name;
2563 out <<
"binary (protocol, &data, &len";
2565 out <<
"string (protocol, &" << name;
2568 case t_base_type::TYPE_XML:
2569 out <<
"xml (protocol, &" << name;
2572 out <<
"bool (protocol, &" << name;
2575 out <<
"byte (protocol, &" << name;
2578 out <<
"i16 (protocol, &" << name;
2581 out <<
"i32 (protocol, &" << name;
2584 out <<
"i64 (protocol, &" << name;
2586 case t_base_type::TYPE_U16:
2587 out <<
"u16 (protocol, &" << name;
2589 case t_base_type::TYPE_U32:
2590 out <<
"u32 (protocol, &" << name;
2592 case t_base_type::TYPE_U64:
2593 out <<
"u64 (protocol, &" << name;
2596 out <<
"double (protocol, &" << name;
2598 case t_base_type::TYPE_IPV4:
2599 out <<
"ipv4 (protocol, &" << name;
2601 case t_base_type::TYPE_IPADDR:
2602 out <<
"ipaddr (protocol, &" << name;
2604 case t_base_type::TYPE_UUID:
2605 out <<
"uuid_t (protocol, &" << name;
2608 throw "compiler error: no C reader for base type "
2611 out <<
", error)) < 0)" << endl;
2612 out << indent() <<
" return " << error_ret <<
";" << endl <<
2613 indent() <<
"xfer += ret;" << endl;
2616 string t = tmp (
"ecast");
2618 indent() <<
"int32_t " << t <<
";" << endl <<
2619 indent() <<
"if ((ret = thrift_protocol_read_i32 (protocol, &" << t <<
", error)) < 0)" << endl <<
2620 indent() <<
" return " << error_ret <<
";" << endl <<
2621 indent() <<
"xfer += ret;" << endl <<
2622 indent() << name <<
" = (" << type_name (type) <<
")" << t <<
";" << endl;
2624 printf (
"DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
2625 tfield->
get_name().c_str(), type_name (type).c_str());
2632 indent(out) << prefix <<
"__isset_" << tfield->
get_name() << suffix <<
" = 1;" << endl;
2634 indent(out) <<
"isset_" << tfield->
get_name() <<
" = 1;" << endl;
2647 throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " +
2651 string name = prefix + tfield->
get_name() + suffix;
2654 generate_deserialize_struct_from_buffer (out, (
t_struct *) type, name, error_ret);
2656 generate_deserialize_container_from_buffer (out, type, name, error_ret);
2662 throw "compiler error: cannot serialize void field in a struct: " + name;
2666 throw "CANNOT GENERATE DESERIALIZE CODE FOR binary TYPE: " + name;
2668 generate_deserialize_string_from_buffer (out, name, error_ret);
2671 case t_base_type::TYPE_XML:
2672 generate_deserialize_xml_from_buffer (out, name, error_ret);
2675 generate_deserialize_bool_from_buffer (out, name, error_ret);
2678 generate_deserialize_byte_from_buffer (out, name, error_ret);
2681 generate_deserialize_i16_from_buffer (out, name, error_ret);
2684 generate_deserialize_i32_from_buffer (out, name, error_ret);
2687 generate_deserialize_i64_from_buffer (out, name, error_ret);
2689 case t_base_type::TYPE_U16:
2690 generate_deserialize_u16_from_buffer (out, name, error_ret);
2692 case t_base_type::TYPE_U32:
2693 generate_deserialize_u32_from_buffer (out, name, error_ret);
2695 case t_base_type::TYPE_U64:
2696 generate_deserialize_u64_from_buffer (out, name, error_ret);
2699 generate_deserialize_double_from_buffer (out, name, error_ret);
2701 case t_base_type::TYPE_IPV4:
2702 generate_deserialize_i32_from_buffer (out, name, error_ret);
2704 case t_base_type::TYPE_IPADDR:
2705 generate_deserialize_ipaddr_from_buffer (out, name, error_ret);
2707 case t_base_type::TYPE_UUID:
2708 generate_deserialize_uuid_t_from_buffer (out, name, error_ret);
2711 throw "compiler error: no C reader for base type "
2715 generate_deserialize_i32_from_buffer (out, name, error_ret);
2717 printf (
"DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
2718 tfield->
get_name().c_str(), type_name (type).c_str());
2725 indent(out) << prefix <<
"__isset_" << tfield->
get_name() << suffix <<
" = 1;" << endl;
2727 indent(out) <<
"isset_" << tfield->
get_name() <<
" = 1;" << endl;
2736 indent() << prefix <<
" = (" << tstruct->
get_name() <<
"* ) os_zalloc (sizeof(*" << prefix <<
"));" << endl <<
2737 indent() <<
"if ((ret = " << tstruct->
get_name() <<
"_read (" << prefix <<
", protocol, error)) < 0)" << endl <<
2738 indent() <<
" return " << error_ret <<
";" << endl <<
2739 indent() <<
"xfer += ret;" << endl;
2747 indent() << prefix <<
" = (" << tstruct->
get_name() <<
"* ) os_zalloc (sizeof(*" << prefix <<
"));" << endl <<
2748 indent() <<
"if ((Xret = " << tstruct->
get_name() <<
"_read_binary_from_buffer (" << prefix <<
2749 ", Xbuf + Xoffset, Xbuflen - Xoffset, Xerror)) < 0)" << endl <<
2750 indent() <<
" return " << error_ret <<
";" << endl <<
2751 indent() <<
"Xoffset += Xret;" << endl;
2755 string prefix,
int error_ret) {
2759 throw "compiler error: deserialize of map not supported in C";
2760 }
else if (ttype->
is_set()) {
2761 throw "compiler error: deserialize of set not supported in C";
2762 }
else if (ttype->
is_list()) {
2764 indent() <<
"ThriftType element_type;" << endl <<
2765 indent() <<
"if ((ret = thrift_protocol_read_list_begin (protocol, &element_type, &" << prefix <<
"_size, error)) < 0)" << endl <<
2766 indent() <<
" return " << error_ret <<
";" << endl <<
2767 indent() <<
"xfer += ret;" << endl <<
2771 indent() << prefix <<
" = (" << type_name(ttype,
false,
false) <<
2772 ") os_zalloc (sizeof(*" << prefix <<
") * " << prefix <<
"_size);" << endl;
2774 indent() <<
"/* iterate through list elements */" << endl <<
2775 indent() <<
"for (i = 0; i < " << prefix <<
"_size; i++)" << endl;
2778 generate_deserialize_list_element (out, (
t_list *) ttype, prefix,
"i",
2783 indent() <<
"if ((ret = thrift_protocol_read_list_end (protocol, error)) < 0)" << endl <<
2784 indent() <<
" return " << error_ret <<
";" << endl <<
2785 indent() <<
"xfer += ret;" << endl <<
2793 string element_size,
2795 string element_type8(tmp(
"Xelement_type8"));
2797 indent() <<
"/* thrift_protocol_read_list_begin */" << endl;
2800 indent() <<
"int8_t " << element_type8 <<
";" << endl;
2801 generate_deserialize_byte_from_buffer (out, element_type8, error_ret);
2803 generate_deserialize_i32_from_buffer (out, element_size, error_ret);
2808 indent() <<
"/* thrift_protocol_read_list_end */" << endl;
2812 string prefix,
int error_ret) {
2816 throw "compiler error: deserialize of map not supported in C";
2817 }
else if (ttype->
is_set()) {
2818 throw "compiler error: deserialize of set not supported in C";
2819 }
else if (ttype->
is_list()) {
2820 string element_size(prefix +
"_size");
2821 generate_list_begin_reader_from_buffer (out, element_size, error_ret);
2823 indent() << prefix <<
" = (" << type_name(ttype,
false,
false) <<
2824 ") os_zalloc (sizeof(*" << prefix <<
") * " << element_size <<
");" << endl;
2826 indent() <<
"/* iterate through list elements */" << endl <<
2827 indent() <<
"for (Xi = 0; Xi < " << element_size <<
"; Xi++)" << endl;
2830 generate_deserialize_list_element_from_buffer (out, (
t_list *) ttype, prefix,
"Xi",
2834 generate_list_end_reader_from_buffer (out);
2845 string elem = prefix +
"[" + index +
"]";
2847 generate_deserialize_field (out, &felem,
"",
"", error_ret);
2855 string elem = prefix +
"[" + index +
"]";
2857 generate_deserialize_field_from_buffer (out, &felem,
"",
"", error_ret);
2869 std::transform (s.begin(), s.end(), s.begin(), ::toupper);
2879 std::transform (s.begin(), s.end(), s.begin(), ::tolower);
2893 const char *tmp = name.c_str();
2897 ret += tolower (tmp[pos]);
2899 for (
unsigned int i = pos; i < name.length(); i++) {
2900 char lc = tolower (tmp[i]);
void generate_field_stop_writer_to_buffer(ofstream &out, int error_ret)
void generate_read_buffer_chk_memcpy_incr_offset(ofstream &out, string dest, string length, int error_ret, bool ref)
virtual bool is_xception() const
const std::string & get_name() const
void generate_deserialize_i16_from_buffer(ofstream &out, string name, int error_ret)
void generate_struct_reader(ofstream &out, string name, const vector< t_field * > &fields, bool is_sandesh, bool is_function=true)
void generate_deserialize_u16_from_buffer(ofstream &out, string name, int error_ret)
void generate_deserialize_xml_from_buffer(ofstream &out, string name, int error_ret)
t_type * get_type() const
string to_lower_case(string name)
void generate_serialize_i32_to_buffer(ofstream &out, string name, int error_ret)
void generate_deserialize_uuid_t_from_buffer(ofstream &out, string name, int error_ret)
void generate_deserialize_u64_from_buffer(ofstream &out, string name, int error_ret)
void generate_serialize_ipaddr_to_buffer(ofstream &out, string name, int error_ret)
void generate_buffer_incr_offset(ofstream &out, string length)
void generate_write_buffer_memcpy_incr_offset(ofstream &out, string source, string length, bool ref)
void generate_serialize_list_element_to_buffer(ofstream &out, t_list *tlist, string list, string index, int error_ret)
void generate_serialize_container_to_buffer(ofstream &out, t_type *ttype, string prefix, int error_ret)
void generate_struct_begin_writer_to_buffer(ofstream &out, string name, bool is_sandesh, int error_ret)
void generate_serialize_uuid_t_to_buffer(ofstream &out, string name, int error_ret)
static std::string t_base_name(t_base tbase)
void generate_write_buffer_binary(ofstream &out, string buf, string buf_len, int error_ret)
void generate_serialize_struct(ofstream &out, t_struct *tstruct, string prefix, int error_ret)
void generate_list_begin_writer_to_buffer(ofstream &out, string element_type, string length, int error_ret)
void generate_serialize_double_to_buffer(ofstream &out, string name, int error_ret)
virtual bool is_map() const
void generate_field_end_reader_from_buffer(ofstream &out)
void generate_deserialize_field(ofstream &out, t_field *tfield, string prefix, string suffix, int error_ret)
void generate_serialize_i64_to_buffer(ofstream &out, string name, int error_ret)
void generate_field_end_writer_to_buffer(ofstream &out)
std::string get_cpp_name()
void generate_deserialize_string_from_buffer(ofstream &out, string name, int error_ret)
void generate_list_end_reader_from_buffer(ofstream &out)
void generate_struct_end_reader_from_buffer(ofstream &out, bool is_sandesh)
virtual bool is_enum() const
t_type * get_type() const
virtual bool is_base_type() const
void generate_deserialize_container(ofstream &out, t_type *ttype, string prefix, int error_ret)
void generate_struct(t_struct *tstruct)
void generate_deserialize_bool_from_buffer(ofstream &out, string name, int error_ret)
void generate_write_buffer_chk_memcpy_incr_offset(ofstream &out, string source, string length, int error_ret, bool ref)
void generate_list_begin_reader_from_buffer(ofstream &out, string element_size, int error_ret)
const members_type & get_members()
void generate_serialize_xml_to_buffer(ofstream &out, string name, int error_ret)
void generate_service(t_service *tservice)
string base_type_name(t_base_type *type)
int64_t get_integer() const
void generate_serialize_field(ofstream &out, t_field *tfield, string prefix, string suffix, int error_ret)
void generate_struct_begin_reader_from_buffer(ofstream &out, string name, bool is_sandesh, int error_ret)
t_const_value_type get_type() const
virtual bool is_container() const
void generate_consts(vector< t_const * > consts)
void generate_list_end_writer_to_buffer(ofstream &out)
void generate_deserialize_field_from_buffer(ofstream &out, t_field *tfield, string prefix, string suffix, int error_ret)
void generate_serialize_container(ofstream &out, t_type *ttype, string prefix, int error_ret)
string declare_field(t_field *tfield, bool init=false, bool pointer=false, bool constant=false, bool reference=false)
void generate_deserialize_u32_from_buffer(ofstream &out, string name, int error_ret)
virtual bool is_set() const
void generate_serialize_u64_to_buffer(ofstream &out, string name, int error_ret)
void generate_const_initializer(string name, t_type *type, t_const_value *value)
void generate_struct_end_writer_to_buffer(ofstream &out, bool is_sandesh)
void generate_write_buffer_memcpy(ofstream &out, string source, string length, bool ref)
void generate_serialize_byte_to_buffer(ofstream &out, string name, int error_ret)
void generate_sandesh_info()
void generate_object(t_struct *tstruct)
std::string get_uuid() const
virtual bool is_void() const
void generate_field_begin_reader_from_buffer(ofstream &out, string field_type, string field_id, int error_ret)
void generate_deserialize_list_element_from_buffer(ofstream &out, t_list *tlist, string prefix, string index, int error_ret)
t_type * get_elem_type() const
void generate_field_begin_writer_to_buffer(ofstream &out, string key, string field_type, int error_ret)
t_c_generator(t_program *program, const map< string, string > &parsed_options, const string &option_string)
bool is_complex_type(t_type *ttype)
void generate_buffer_bounds_chk(ofstream &out, string length, int error_ret)
const std::string & get_symbolic() const
void generate_struct_reader_from_buffer(ofstream &out, string name, const vector< t_field * > &fields, bool is_sandesh, bool is_function=true)
void generate_object_internal(string name, const vector< t_field * > &members, bool is_sandesh)
virtual const std::string & get_name() const
void generate_read_buffer_memcpy(ofstream &out, string dest, string length, bool ref)
virtual bool is_list() const
void generate_xception(t_struct *tstruct)
void generate_deserialize_double_from_buffer(ofstream &out, string name, int error_ret)
void generate_serialize_string_to_buffer(ofstream &out, string name, int error_ret)
void generate_serialize_bool_to_buffer(ofstream &out, string name, int error_ret)
string initial_caps_to_underscores(string name)
const std::vector< t_enum_value * > & get_constants()
void generate_serialize_field_to_buffer(ofstream &out, t_field *tfield, string prefix, string suffix, int error_ret)
void generate_deserialize_struct(ofstream &out, t_struct *tstruct, string prefix, int error_ret)
void generate_struct_deleter(ofstream &out, string name, const vector< t_field * > &fields, bool is_sandesh, bool is_function=true)
std::string get_string() const
double get_double() const
virtual bool is_struct() const
string type_to_enum(t_type *type)
void generate_read_buffer_memcpy_incr_offset(ofstream &out, string dest, string length, bool ref)
void generate_deserialize_struct_from_buffer(ofstream &out, t_struct *tstruct, string prefix, int error_ret)
void generate_deserialize_i32_from_buffer(ofstream &out, string name, int error_ret)
void generate_serialize_i16_to_buffer(ofstream &out, string name, int error_ret)
void generate_serialize_u32_to_buffer(ofstream &out, string name, int error_ret)
void generate_struct_writer(ofstream &out, string name, const vector< t_field * > &fields, bool is_sandesh, bool is_function=true)
string type_name(t_type *ttype, bool in_typedef=false, bool is_const=false)
void generate_enum(t_enum *tenum)
void generate_deserialize_ipaddr_from_buffer(ofstream &out, string name, int error_ret)
void generate_deserialize_list_element(ofstream &out, t_list *tlist, string prefix, string index, int error_ret)
void generate_serialize_struct_to_buffer(ofstream &out, t_struct *tstruct, string prefix, int error_ret)
void generate_serialize_list_element(ofstream &out, t_list *tlist, string list, string index, int error_ret)
void generate_deserialize_byte_from_buffer(ofstream &out, string name, int error_ret)
void generate_typedef(t_typedef *ttypedef)
void generate_deserialize_i64_from_buffer(ofstream &out, string name, int error_ret)
void generate_sandesh(t_sandesh *tsandesh)
string to_upper_case(string name)
void generate_service_client(t_service *tservice)
string argument_list(t_struct *tstruct)
void generate_service_server(t_service *tservice)
void generate_struct_writer_to_buffer(ofstream &out, string name, const vector< t_field * > &fields, bool is_sandesh, bool is_function=true)
void generate_deserialize_container_from_buffer(ofstream &out, t_type *ttype, string prefix, int error_ret)
string constant_value(string name, t_type *type, t_const_value *value)
#define THRIFT_REGISTER_GENERATOR(language, long_name, doc)
void generate_serialize_u16_to_buffer(ofstream &out, string name, int error_ret)