diff -urN cui94/timer.c cui95/timer.c --- cui94/timer.c Thu Mar 27 23:00:00 2014 +++ cui95/timer.c Wed Apr 2 01:00:00 2014 @@ -1,23 +1,18 @@ #include "timer.h" #include "handler.h" +#include "list.h" #include #include #include -static cui_timer_list timer_list = NULL; +static cui_list timer_list = NULL; -static cui_timer_list -cui_timer_search(cui obj, cui_timer_list **ret_prev) -{ - cui_timer_list p = timer_list, *prev = &timer_list; - for(; p; prev=&p->next, p=p->next){ - if(p->obj == obj){ - if(ret_prev) *ret_prev = prev; - return p; - } - } - return NULL; -} +typedef struct cui_timer{ + cui obj; + int msec; + int once; + int targ_msec; +} *cui_timer; int cui_timer_now_msec(void) @@ -28,57 +23,45 @@ } static void -cui_timer_init(cui_timer_list p, cui obj, int msec, int once, cui_timer_list next) +cui_timer_init(cui_timer p, cui obj, int msec, int once) { p->obj = obj; p->msec = msec; p->once = once; - p->next = next; p->targ_msec = cui_timer_now_msec() + msec; } -static cui_timer_list -cui_timer_new(cui obj, int msec, int once, cui_timer_list next) -{ - cui_timer_list p; - if((p = malloc(sizeof(struct cui_timer_list))) == NULL) ERR("No Mem"); - cui_timer_init(p, obj, msec, once, next); - return p; -} - -static void -cui_timer_del(cui obj) -{ - cui_timer_list *prev, p = cui_timer_search(obj, &prev); - if(p == NULL) return; - *prev = p->next; - free(p); -} - void cui_timer_set(cui obj, int msec, int once) { - cui_timer_list p = cui_timer_search(obj, NULL); - if(p == NULL){ - timer_list = cui_timer_new(obj, msec, once, timer_list); + cui_timer p; + cui_list lp = timer_list; + for(; lp; lp=lp->next){ + p = (cui_timer)lp->data; + if(p->obj == obj) break; + } + if(lp == NULL){ + p = cui_list_add(&timer_list, sizeof(struct cui_timer)); + cui_timer_init(p, obj, msec, once); return; } if(msec >= 0){ - cui_timer_init(p, obj, msec, once, p->next); + cui_timer_init(p, obj, msec, once); return; } - cui_timer_del(obj); + cui_list_del(&timer_list, p); } void cui_timer_work(void) { - cui_timer_list p = timer_list; - for(; p; p=p->next){ + cui_list lp = timer_list; + for(; lp; lp=lp->next){ + cui_timer p = (cui_timer)lp->data; int msec = cui_timer_now_msec(); if(msec < p->targ_msec) continue; cui_handler_call(p->obj, CUI_EVT_TIMER, msec); - if(p->once) cui_timer_del(p->obj); + if(p->once) cui_list_del(&timer_list, p); else p->targ_msec += p->msec; } } diff -urN cui94/timer.h cui95/timer.h --- cui94/timer.h Thu Mar 27 23:00:00 2014 +++ cui95/timer.h Wed Apr 2 01:00:00 2014 @@ -3,16 +3,6 @@ #include "cui.h" -typedef struct cui_timer_list *cui_timer_list; - -struct cui_timer_list{ - cui obj; - int msec; - int once; - int targ_msec; - cui_timer_list next; -}; - void cui_timer_set(cui obj, int msec, int once); int cui_timer_now_msec(void); void cui_timer_work(void);