Пример #1
0
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;
}
Пример #2
0
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;
}