static void print_struct (const rpc_struct *s) { const rpc_decl *dp = s->decls.base (), *ep = s->decls.lim (); size_t num = ep - dp; aout << "const strbuf &\n" "rpc_print (const strbuf &sb, const " << s->id << " &obj, " "int recdepth,\n" " const char *name, const char *prefix)\n" "{\n" " if (name) {\n" " if (prefix)\n" " sb << prefix;\n" " sb << \"" << s->id << " \" << name << \" = \";\n" " };\n" " str npref;\n" " if (prefix) {\n" " npref = strbuf (\"%s \", prefix);\n" " sb << \"{\\n\";\n" " } else {\n" " sb << \"{ \";\n" " }\n"; if (num > 1) { aout << " const char *sep = NULL;\n" " if (prefix) {\n" " sep = \"\";\n" " } else {\n" " sep = \", \";\n" " }\n" ; } if (dp < ep) aout << " rpc_print (sb, obj." << dp->id << ", recdepth, " "\"" << dp->id << "\", npref.cstr());\n"; while (++dp < ep) aout << " sb << sep;\n" " rpc_print (sb, obj." << dp->id << ", recdepth, " "\"" << dp->id << "\", npref.cstr());\n"; aout << " if (prefix)\n" " sb << prefix << \"};\\n\";\n" " else\n" " sb << \" }\";\n" " return sb;\n" "}\n"; print_print (s->id); }
static void dumpprint (const rpc_sym *s) { switch (s->type) { case rpc_sym::STRUCT: print_struct (s->sstruct.addr ()); break; case rpc_sym::UNION: print_union (s->sunion.addr ()); break; case rpc_sym::ENUM: print_enum (s->senum.addr ()); break; case rpc_sym::TYPEDEF: print_print (s->stypedef->id); default: break; } }
static void print_union (const rpc_union *s) { bool ns = will_need_sep(s); aout << "const strbuf &\n" "rpc_print (const strbuf &sb, const " << s->id << " &obj, " "int recdepth,\n" " const char *name, const char *prefix)\n" "{\n" " if (name) {\n" " if (prefix)\n" " sb << prefix;\n" " sb << \"" << s->id << " \" << name << \" = \";\n" " };\n" << ((ns) ? " const char *sep;\n" : "") << " str npref;\n" " if (prefix) {\n" " npref = strbuf (\"%s \", prefix);\n" << ((ns) ? " sep = \"\";\n" : "") << " sb << \"{\\n\";\n" " }\n" " else {\n" << ((ns) ? " sep = \", \";\n" : "") << " sb << \"{ \";\n" " }\n" " rpc_print (sb, obj." << s->tagid << ", recdepth, " "\"" << s->tagid << "\", npref.cstr());\n"; pswitch (" ", s, "obj." << s->tagid, print_case, "\n", print_break); aout << " if (prefix)\n" " sb << prefix << \"};\\n\";\n" " else\n" " sb << \" }\";\n" " return sb;\n" "}\n"; print_print (s->id); }
static void print_enum (const rpc_enum *s) { aout << "const strbuf &\n" "rpc_print (const strbuf &sb, const " << s->id << " &obj, " "int recdepth,\n" " const char *name, const char *prefix)\n" "{\n" " char *p;\n" " switch (obj) {\n"; for (const rpc_const *cp = s->tags.base (), *ep = s->tags.lim (); cp < ep; cp++) aout << " case " << cp->id << ":\n" " p = \"" << cp->id << "\";\n" " break;\n"; aout << " default:\n" " p = NULL;\n" " break;\n" " }\n" " if (name) {\n" " if (prefix)\n" " sb << prefix;\n" " sb << \"" << s->id << " \" << name << \" = \";\n" " };\n" " if (p)\n" " sb << p;\n" " else\n" " sb << int (obj);\n" " if (prefix)\n" " sb << \";\\n\";\n" " return sb;\n" "};\n"; print_print (s->id); }