--- a/obj.c Mon Feb 16 18:09:03 2004 +0100 +++ b/obj.c Mon Feb 16 18:50:28 2004 +0100 @@ -27,28 +27,28 @@ void destroy_obj(Obj *obj) { - ClassDescr *d; - - if(OBJ_IS_BEING_DESTROYED(obj)) - return; - - obj->flags|=OBJ_DEST; - - do_watches(obj, TRUE); - - d=obj->obj_type; - - while(d!=NULL){ - if(d->destroy_fn!=NULL){ - d->destroy_fn(obj); - break; - } - d=d->ancestor; - } - - do_watches(obj, FALSE); + ClassDescr *d; + + if(OBJ_IS_BEING_DESTROYED(obj)) + return; + + obj->flags|=OBJ_DEST; + + do_watches(obj, TRUE); + + d=obj->obj_type; + + while(d!=NULL){ + if(d->destroy_fn!=NULL){ + d->destroy_fn(obj); + break; + } + d=d->ancestor; + } + + do_watches(obj, FALSE); - free(obj); + free(obj); } @@ -60,55 +60,55 @@ bool obj_is(const Obj *obj, const ClassDescr *descr) { - ClassDescr *d; - - if(obj==NULL) - return FALSE; - - d=obj->obj_type; - - while(d!=NULL){ - if(d==descr) - return TRUE; - d=d->ancestor; - } - return FALSE; + ClassDescr *d; + + if(obj==NULL) + return FALSE; + + d=obj->obj_type; + + while(d!=NULL){ + if(d==descr) + return TRUE; + d=d->ancestor; + } + return FALSE; } bool obj_is_str(const Obj *obj, const char *str) { - ClassDescr *d; - - if(obj==NULL || str==NULL) - return FALSE; - - d=obj->obj_type; - - while(d!=NULL){ - if(strcmp(d->name, str)==0) - return TRUE; - d=d->ancestor; - } - return FALSE; + ClassDescr *d; + + if(obj==NULL || str==NULL) + return FALSE; + + d=obj->obj_type; + + while(d!=NULL){ + if(strcmp(d->name, str)==0) + return TRUE; + d=d->ancestor; + } + return FALSE; } const void *obj_cast(const Obj *obj, const ClassDescr *descr) { - ClassDescr *d; - - if(obj==NULL) - return NULL; - - d=obj->obj_type; - - while(d!=NULL){ - if(d==descr) - return (void*)obj; - d=d->ancestor; - } - return NULL; + ClassDescr *d; + + if(obj==NULL) + return NULL; + + d=obj->obj_type; + + while(d!=NULL){ + if(d==descr) + return (void*)obj; + d=d->ancestor; + } + return NULL; } @@ -127,90 +127,90 @@ static int comp_fun(const void *a, const void *b) { - void *af=(void*)((DynFunTab*)a)->func; - void *bf=(void*)((DynFunTab*)b)->func; - - return (af<bf ? -1 : (af==bf ? 0 : 1)); + void *af=(void*)((DynFunTab*)a)->func; + void *bf=(void*)((DynFunTab*)b)->func; + + return (af<bf ? -1 : (af==bf ? 0 : 1)); } - + DynFun *lookup_dynfun(const Obj *obj, DynFun *func, - bool *funnotfound) + bool *funnotfound) { - ClassDescr *descr; - DynFunTab *df; - /*DynFunTab dummy={NULL, NULL};*/ - /*dummy.func=func;*/ - - if(obj==NULL) - return NULL; - - descr=obj->obj_type; - - for(; descr!=&Obj_classdescr; descr=descr->ancestor){ - if(descr->funtab==NULL) - continue; - - if(descr->funtab_n==-1){ - /* Need to sort the table. */ - descr->funtab_n=0; - df=descr->funtab; - while(df->func!=NULL){ - descr->funtab_n++; - df++; - } - - if(descr->funtab_n>0){ - qsort(descr->funtab, descr->funtab_n, sizeof(DynFunTab), - comp_fun); - } - } - - /* - if(descr->funtab_n==0) - continue; - - df=(DynFunTab*)bsearch(&dummy, descr->funtab, descr->funtab_n, - sizeof(DynFunTab), comp_fun); - if(df!=NULL){ - *funnotfound=FALSE; - return df->handler; - } - */ - - /* Using custom bsearch instead of the one in libc is probably - * faster as the overhead of calling a comparison function would - * be significant given that the comparisons are simple and - * funtab_n not that big. - */ - { - int min=0, max=descr->funtab_n-1; - int ndx; - df=descr->funtab; - while(max>=min){ - ndx=(max+min)/2; - if((void*)df[ndx].func==(void*)func){ - *funnotfound=FALSE; - return df[ndx].handler; - } - if((void*)df[ndx].func<(void*)func) - min=ndx+1; - else - max=ndx-1; - } - } - } - - *funnotfound=TRUE; - return dummy_dyn; + ClassDescr *descr; + DynFunTab *df; + /*DynFunTab dummy={NULL, NULL};*/ + /*dummy.func=func;*/ + + if(obj==NULL) + return NULL; + + descr=obj->obj_type; + + for(; descr!=&Obj_classdescr; descr=descr->ancestor){ + if(descr->funtab==NULL) + continue; + + if(descr->funtab_n==-1){ + /* Need to sort the table. */ + descr->funtab_n=0; + df=descr->funtab; + while(df->func!=NULL){ + descr->funtab_n++; + df++; + } + + if(descr->funtab_n>0){ + qsort(descr->funtab, descr->funtab_n, sizeof(DynFunTab), + comp_fun); + } + } + + /* + if(descr->funtab_n==0) + continue; + + df=(DynFunTab*)bsearch(&dummy, descr->funtab, descr->funtab_n, + sizeof(DynFunTab), comp_fun); + if(df!=NULL){ + *funnotfound=FALSE; + return df->handler; + } + */ + + /* Using custom bsearch instead of the one in libc is probably + * faster as the overhead of calling a comparison function would + * be significant given that the comparisons are simple and + * funtab_n not that big. + */ + { + int min=0, max=descr->funtab_n-1; + int ndx; + df=descr->funtab; + while(max>=min){ + ndx=(max+min)/2; + if((void*)df[ndx].func==(void*)func){ + *funnotfound=FALSE; + return df[ndx].handler; + } + if((void*)df[ndx].func<(void*)func) + min=ndx+1; + else + max=ndx-1; + } + } + } + + *funnotfound=TRUE; + return dummy_dyn; } bool has_dynfun(const Obj *obj, DynFun *func) { - bool funnotfound; - lookup_dynfun(obj, func, &funnotfound); - return !funnotfound; + bool funnotfound; + lookup_dynfun(obj, func, &funnotfound); + return !funnotfound; } @@ -222,74 +222,74 @@ bool watch_setup(Watch *watch, Obj *obj, WatchHandler *handler) { - if(OBJ_IS_BEING_DESTROYED(obj)) - return FALSE; - - watch_reset(watch); - - watch->handler=handler; - LINK_ITEM(obj->obj_watches, watch, next, prev); - watch->obj=obj; - - return TRUE; + if(OBJ_IS_BEING_DESTROYED(obj)) + return FALSE; + + watch_reset(watch); + + watch->handler=handler; + LINK_ITEM(obj->obj_watches, watch, next, prev); + watch->obj=obj; + + return TRUE; } void do_watch_reset(Watch *watch, bool call) { - WatchHandler *handler=watch->handler; - Obj *obj=watch->obj; - - watch->handler=NULL; - - if(obj==NULL) - return; - - UNLINK_ITEM(obj->obj_watches, watch, next, prev); - watch->obj=NULL; - - if(call && handler!=NULL) - handler(watch, obj); + WatchHandler *handler=watch->handler; + Obj *obj=watch->obj; + + watch->handler=NULL; + + if(obj==NULL) + return; + + UNLINK_ITEM(obj->obj_watches, watch, next, prev); + watch->obj=NULL; + + if(call && handler!=NULL) + handler(watch, obj); } void watch_reset(Watch *watch) { - do_watch_reset(watch, FALSE); + do_watch_reset(watch, FALSE); } bool watch_ok(Watch *watch) { - return watch->obj!=NULL; + return watch->obj!=NULL; } static void do_watches(Obj *obj, bool call) { - Watch *watch, *next; + Watch *watch, *next; - watch=obj->obj_watches; - - while(watch!=NULL){ - next=watch->next; - do_watch_reset(watch, call); - watch=next; - } + watch=obj->obj_watches; + + while(watch!=NULL){ + next=watch->next; + do_watch_reset(watch, call); + watch=next; + } } void watch_call(Obj *obj) { - do_watches(obj, FALSE); + do_watches(obj, FALSE); } void watch_init(Watch *watch) { - watch->obj=NULL; - watch->next=NULL; - watch->prev=NULL; - watch->handler=NULL; + watch->obj=NULL; + watch->next=NULL; + watch->prev=NULL; + watch->handler=NULL; }