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 int pfunc (void) { int fi, di, si, ifi, ifn, ldi, i, li1, li2; int owncbufi, ownflvi, ownllvi, flvn, ifnum; owncbufi = Cgetindex (); ownflvi = flvi, ownllvi = llvi; flvi = llvi; flvn = 0; fi = Cnew (C_FUNCTION); GTOKIFEQ (L_LP); li1 = Cinteger (0); Csetfp (fi, li1); li2 = Cinteger (0); Csetnext (li1, li2); di = pdecl (&flvn); Csetnext (li2, di); i = di; GTOKIFEQ (L_RP); if (Ltok == L_INTERNAL) { Lgtok (); if (Ltok == L_STRING) { if ((ifnum = Igetfunc (Lstrtok)) == -1) err ("no such internal function: %s", Lstrtok); ifi = Cnew (C_INTERNAL); ifn = Cinteger ((long) ifnum); Csetfp (ifi, ifn); Csetnext (i, ifi); Lgtok (); } else err ("expected token: STRING, found: '%s'", Lnames[Ltok]); } else { GTOKIFEQ (L_LCB); while (Ltok == L_LOCAL) { Lgtok (); ldi = pdecl (&flvn); Csetnext (i, ldi); i = ldi; GTOKIFEQ (L_SEMI); } while (Ltok != L_RCB) { si = pstmt (); Csetnext (i, si); i = si; } GTOKIFEQ (L_RCB); } Csetinteger (li1, (long) (Cgetindex () - owncbufi)); Csetinteger (li2, (long) flvn); flvi = ownflvi, llvi = ownllvi; return fi; }