|
I find this usefull, apologies not in patch form,
besides I think it'll be dismissed anyway...
list.c
/*
* enumerate thru the items of the list, calling the user supplied function * with each item, plus optionally some environment structure * if user fn returns 0, the enumeration can prematurely abort * * eg * int prntmsgs(void *env, void * _msg); * ... * list_enumerate(list,0,prntmsgs); */ void list_enumerate(List *list, void * env, int (*fn)(void *env,void *item) ) { long i; void *item;
lock(list);
item = NULL; for (i = 0; i < list->len; ++i) { item = GET(list, i);
if (fn(env,item))
break; } if (i == list->len) { item = NULL; } unlock(list); return
item;
} /* how to use
...*
bb_box.c
#if DEBUG
/*
* helper fn for user use in gdb */ int prntmsgs(void *env, void *
_msg)
{ Msg *msg = _msg; char *type = ""; switch(msg->sms.sms_type) { case mo: type = "mo";break; case mt_reply: type = "mt_reply";break; case report_mo: type = "report_mo";break; case report_mt: type = "report_mt";break; default: type = "unknown"; } debug("bb.boxc", 0,"sms:
sender <%s> receiver <%s> smsc <%s> id=%d sms_type=%s
dlrmask=%d tid=%d",
octstr_get_cstr(msg->sms.sender), octstr_get_cstr(msg->sms.receiver), octstr_get_cstr(msg->sms.smsc_id), msg->sms.id, type, msg->sms.dlr_mask, msg->sms.tid ); return 0; } void listprint(int
who)
{ List *list; int len; int i; if(who==1)
list = incoming_sms; if(who==2) list = outgoing_sms; len =
list_len(list);
list_enumerate(list,0,prntmsgs);
} #endif
say your in gdb,
do
call
listprint(1)
call
listprint(2);
*** very useful when
your debugging and just want to see whats in the list at anytime !!
***
|
