static bsd_status_t bsd_object( bsd_ctx_t *ctx, bsd_data_t *x, bs_classid_t classid) { const bs_class_t *klass = bs_classcoll_get( &ctx->classcoll, classid); union bsd_stackframecontent_t *f = NULL; bsd_status_t status; if( NULL == klass) { return BSD_EBADCLASSID; } x->kind = BSD_OBJECT; x->content.classdef = klass; status = openContainer( ctx, BS_FOBJECT, BS_CTXID_GLOBAL, klass->nfields, &f); f->object.classdef = klass; return status; }
int bs_classcoll_set( bs_classcoll_t *coll, const bs_class_t* classdef) { const bs_class_t* existing = bs_classcoll_get( coll, classdef->classid); int slot; if( NULL != existing) { /* overwrite class definition */ slot = existing - coll->classes[0]; if( BS_CLASS_MANAGED == existing->mode) { free((void *)existing); } } else { /* insert new class at correct place */ int i; coll->classes = realloc( coll->classes, (coll->nclasses + 1) * sizeof( bs_class_t *)); if( NULL == coll->classes) return -1; for( slot = 0; slot < coll->nclasses && coll->classes[slot]->classid < classdef->classid; slot++); for( i=coll->nclasses; i > slot; i--) coll->classes[i] = coll->classes[i-1]; coll->nclasses += 1; } coll->classes[slot] = classdef; return 0; }