static adbus_Member* AddMethod( adbus_Interface* i, adbusI_MemberType type, const char* name, int size) { if (size < 0) size = strlen(name); adbus_Member* m = NEW(adbus_Member); m->interface = i; m->type = type; m->name.str = adbusI_strndup(name, size); m->name.sz = size; int ret; dh_Iter ki = dh_put(MemberPtr, &i->members, m->name, &ret); if (!ret) { FreeMember(dh_val(&i->members, ki)); } dh_key(&i->members, ki) = m->name; dh_val(&i->members, ki) = m; return m; }
void Typedef(Member *td_names, Type *decl) { Member *m, *t; m = ApplyMemberType(td_names, decl); while (m) { t = m->next; if (FindType(m->name)) { int i; for (i = 0; i < EXTENDED_TYPES; i++) if (!strcmp(m->name, extended_types[i])) break; #ifdef REDEF_ERROR if (i == EXTENDED_TYPES) LexError("'%s' redefinition ignored", m->name); #endif FreeMember(m); } else { AddType(NewTypedefType(m->name, m->type)); /* Can't use FreeMember since we want to keep the name */ free(m); } m = t; } }
void FreeMemberList(Member *list) { Member *m; while (list) { m = list->next; FreeMember(list); list = m; } }
/** Derefs an interface. * \relates adbus_Interface */ void adbus_iface_deref(adbus_Interface* i) { if (i && adbus_InterlockedDecrement(&i->ref) == 0) { if (ADBUS_TRACE_MEMORY) { adbusI_log("free interface %s", i->name); } for (dh_Iter ii = dh_begin(&i->members); ii != dh_end(&i->members); ++ii) { if (dh_exist(&i->members, ii)) FreeMember(dh_val(&i->members, ii)); } dh_free(MemberPtr, &i->members); free((char*) i->name.str); free(i); } }