/* Copyright (c) 1993 Stephen F. White */ #include <stdio.h> #include "config.h" #include "cool.h" #include "proto.h" #include "sys_proto.h" static int size_methods(HashT *methods); static int size_verbs(Verbdef *vb); static int size_gvars(HashT *vars); static int size_vars(Vardef *vd); static int size_var(Var v); static int size_list(List *list); static int size_symbols(Object *o); static int size_locks(Lock *l); #define size_string(S) (sizeof((S)->len) + (S)->len) int size_object(Object *o) { int sz = 0; sz += sizeof(o->id.id) + sizeof(o->id.server); sz += size_list(o->parents); sz += size_symbols(o); sz += size_methods(o->methods); sz += size_gvars(o->vars); sz += size_verbs(o->verbs); sz += size_locks(o->locks); return sz; } static int size_methods(HashT *methods) { int hval, sz = sizeof(int); /* for nmethods */ Method *m; if (methods) { for (hval = 0; hval < methods->size; hval++) { for (m = (Method *) methods->table[hval]; m; m = m->next) { sz += sizeof(m->name); sz += sizeof(m->ninst) + m->ninst * sizeof(Inst); sz += sizeof(int); /* for nvars */ sz += NERRS * sizeof(enum eh) + size_vars(m->vars); } } } return sz; } static int size_verbs(Verbdef *vb) { int sz = sizeof(int); /* for nverbs */ for (; vb; vb = vb->next) { sz += 3 * sizeof(int); } return sz; } static int size_vars(Vardef *vd) { int sz = 0; for (; vd; vd = vd->next) { sz += sizeof(vd->name) + size_var(vd->value); } return sz; } static int size_gvars(HashT *vars) { int sz = sizeof(int); /* for nvars */ int hval; if (vars) { for (hval = 0; hval < vars->size; hval++) { sz += size_vars(vars->table[hval]); } } return sz; } static int size_var(Var v) { switch (v.type) { case STR: /* 2 == 1 for string terminator, 1 for type */ return size_string(v.v.str) + 1; case NUM: return sizeof(v.v.num) + 1; case OBJ: return sizeof(v.v.obj.id) + sizeof(v.v.obj.server) + 1; case LIST: return size_list(v.v.list) + 1; case ERR: return sizeof(v.v.err) + 1; case PC: /* should never happen */ return 0; } return 0; /* should never happen */ } static int size_list(List *list) { int i, sz = sizeof(list->len); /* size of nels */ for (i = 0; i < list->len; i++) { sz += size_var(list->el[i]); } return sz; } static int size_symbols(Object *o) { int i, sz = sizeof(o->nsymb) + sizeof(o->st_size); for (i = 0; i < o->nsymb; i++) { sz += sizeof(o->symbols[i].ref); if (o->symbols[i].ref) { sz += size_string(o->symbols[i].s); } } return sz; } static int size_locks(Lock *l) { int sz = sizeof(int); /* for nlocks */ for (; l; l = l->next) { sz += size_string(l->name); sz += sizeof(l->added_by); } return sz; }