static void dumpstruct (const rpc_sym *s) { const rpc_struct *rs = s->sstruct.addr (); aout << "\nstruct " << rs->id << " {\n"; for (const rpc_decl *rd = rs->decls.base (); rd < rs->decls.lim (); rd++) pdecl (" ", rd); aout << "};\n"; pmshl (rs->id); aout << "RPC_STRUCT_DECL (" << rs->id << ")\n"; // aout << "RPC_TYPE_DECL (" << rs->id << ")\n"; aout << "\ntemplate<class T> " << (rs->decls.size () > 1 ? "" : "inline ") << "bool\n" << "rpc_traverse (T &t, " << rs->id << " &obj)\n" << "{\n"; const rpc_decl *rd = rs->decls.base (); if (rd < rs->decls.lim ()) { aout << " return rpc_traverse (t, obj." << (rd++)->id << ")"; while (rd < rs->decls.lim ()) aout << "\n && rpc_traverse (t, obj." << (rd++)->id << ")"; aout << ";\n"; } else aout << " return true;\n"; aout << "}\n\n"; }
static void dumpstruct (const rpc_sym *s) { const rpc_struct *rs = s->sstruct.addr (); aout << "\nstruct " << rs->id << " {\n"; for (const rpc_decl *rd = rs->decls.base (); rd < rs->decls.lim (); rd++) pdecl (" ", rd); aout << "};\n"; pmshl (rs->id); aout << "RPC_STRUCT_DECL (" << rs->id << ")\n"; // aout << "RPC_TYPE_DECL (" << rs->id << ")\n"; aout << "\ntemplate<class T> " << (rs->decls.size () > 1 ? "" : "inline ") << "bool\n" << "rpc_traverse (T &t, " << rs->id << " &obj, " << rpc_field << ")\n" << "{\n" << " bool ret = true;\n" << " rpc_enter_field (t, field);\n" ; const rpc_decl *rd = rs->decls.base (); if (rd < rs->decls.lim ()) { aout << " ret = rpc_traverse (t, obj." << rd->id << ", \"" << rd->id << "\")"; rd++; for ( ; rd < rs->decls.lim (); rd++ ) { aout << "\n && rpc_traverse (t, obj." << rd->id << ", \"" << rd->id << "\")"; } aout << ";\n"; } aout << " rpc_exit_field (t, field);\n" << " return ret;\n" << "}\n\n"; }
static void dumptypedef (const rpc_sym *s) { const rpc_decl *rd = s->stypedef.addr (); pdecl ("typedef ", rd); pmshl (rd->id); aout << "RPC_TYPEDEF_DECL (" << rd->id << ")\n"; }
static void dumptypedef (const rpc_sym *s) { const rpc_decl *rd = s->stypedef.addr (); pdecl ("typedef ", rd); pmshl (rd->id); aout << "RPC_TYPEDEF_DECL (" << rd->id << ")\n"; start_xml_guard (); aout << "extern xml_typeinfo_t xml_typeinfo_" << rd->id << ";\n"; end_xml_guard (); }
static void dumpenum (const rpc_sym *s) { int ctr = 0; str lastval; const rpc_enum *rs = s->senum.addr (); aout << "enum " << rs->id << " {\n"; for (const rpc_const *rc = rs->tags.base (); rc < rs->tags.lim (); rc++) { if (rc->val) { lastval = rc->val; ctr = 1; aout << " " << rc->id << " = " << rc->val << ",\n"; } else if (lastval && (isdigit (lastval[0]) || lastval[0] == '-' || lastval[0] == '+')) aout << " " << rc->id << " = " << strtol (lastval.cstr(), NULL, 0) + ctr++ << ",\n"; else if (lastval) aout << " " << rc->id << " = " << lastval << " + " << ctr++ << ",\n"; else aout << " " << rc->id << " = " << ctr++ << ",\n"; } aout << "};\n"; pmshl (rs->id); aout << "RPC_ENUM_DECL (" << rs->id << ")\n" << "TYPE2STRUCT( , " << rs->id << ");\n"; aout << "\ntemplate<class T> inline bool\n" << "rpc_traverse (T &t, " << rs->id << " &obj, " << rpc_field << ")\n" << "{\n" << " u_int32_t val = obj;\n" << " bool ret = true;\n" << " rpc_enter_field (t, field);\n" << " if (!rpc_traverse (t, val)) {\n" << " ret = false;\n" << " } else {\n" << " obj = " << rs->id << " (val);\n" << " }\n" << " rpc_exit_field (t, field);\n" << " return ret;\n" << "}\n"; dumpenum_xml (s); }
static void dumpunion (const rpc_sym *s) { bool hasdefault = false; const rpc_union *rs = s->sunion.addr (); aout << "\nstruct " << rs->id << " {\n" << " const " << rs->tagtype << " " << rs->tagid << ";\n" << " union {\n" << " union_entry_base _base;\n"; for (const rpc_utag *rt = rs->cases.base (); rt < rs->cases.lim (); rt++) { if (!rt->swval) hasdefault = true; if (rt->tagvalid && rt->tag.type != "void") { str type = rpc_decltype (&rt->tag); if (type[type.len ()-1] == '>') type = type << " "; aout << " union_entry<" << type << "> " << rt->tag.id << ";\n"; } } aout << " };\n\n"; aout << "#define rpcunion_tag_" << rs->id << " " << rs->tagid << "\n"; aout << "#define rpcunion_switch_" << rs->id << "(swarg, action, voidaction, defaction) \\\n"; pswitch (" ", rs, "swarg", punionmacro, " \\\n", punionmacrodefault); aout << "\n" << " " << rs->id << " (" << rs->tagtype << " _tag = (" << rs->tagtype << ") 0) : " << rs->tagid << " (_tag)\n" << " { _base.init (); set_" << rs->tagid << " (_tag); }\n" << " " << rs->id << " (" << "const " << rs->id << " &_s)\n" << " : " << rs->tagid << " (_s." << rs->tagid << ")\n" << " { _base.init (_s._base); }\n" << " ~" << rs->id << " () { _base.destroy (); }\n" << " " << rs->id << " &operator= (const " << rs->id << " &_s) {\n" << " const_cast<" << rs->tagtype << " &> (" << rs->tagid << ") = _s." << rs->tagid << ";\n" << " _base.assign (_s._base);\n" << " return *this;\n" << " }\n\n"; aout << " void set_" << rs->tagid << " (" << rs->tagtype << " _tag) {\n" << " const_cast<" << rs->tagtype << " &> (" << rs->tagid << ") = _tag;\n" << " rpcunion_switch_" << rs->id << "\n" << " (_tag, RPCUNION_SET, _base.destroy (), _base.destroy ());\n" << " }\n"; #if 0 aout << " void Xstompcast () {\n" << " rpcunion_switch_" << rs->id << "\n" << " (" << rs->tagid << ", RPCUNION_STOMPCAST,\n" << " _base.destroy (), _base.destroy ());\n" << " }\n"; #endif aout << "};\n"; aout << "\ntemplate<class T> bool\n" << "rpc_traverse (T &t, " << rs->id << " &obj)\n" << "{\n" << " " << rs->tagtype << " tag = obj." << rs->tagid << ";\n" << " if (!rpc_traverse (t, tag))\n" << " return false;\n" << " if (tag != obj." << rs->tagid << ")\n" << " obj.set_" << rs->tagid << " (tag);\n\n" << " rpcunion_switch_" << rs->id << "\n" << " (obj." << rs->tagid << ", RPCUNION_TRAVERSE, " << "return true, return false);\n" << " /* gcc 4.0.3 makes buggy warnings without the following line */\n" << " return false;\n" << "}\n" << "inline bool\n" << "rpc_traverse (const stompcast_t &s, " << rs->id << " &obj)\n" << "{\n" << " rpcunion_switch_" << rs->id << "\n" << " (obj." << rs->tagid << ", RPCUNION_REC_STOMPCAST,\n" << " obj._base.destroy (); return true, " << "obj._base.destroy (); return true;);\n" << " /* gcc 4.0.3 makes buggy warnings without the following line */\n" << " return false;\n" << "}\n"; pmshl (rs->id); // aout << "RPC_TYPE_DECL (" << rs->id << ")\n"; aout << "RPC_UNION_DECL (" << rs->id << ")\n"; aout << "\n"; }