/* util.c */
#include "../ChvList.h"
#define MYDEBUG 0
/*--------------------------------------------------------------------*/
/*
-----------------------------------
return 1 if list ilist is not empty
return 0 if list ilist is empty
created -- 98may02, cca
-----------------------------------
*/
int
ChvList_isListNonempty (
ChvList *chvlist,
int ilist
) {
/*
---------------
check the input
---------------
*/
if ( chvlist == NULL || ilist < 0 || ilist >= chvlist->nlist ) {
fprintf(stderr, "\n fatal error in ChvList_isListNonempty(%p,%d)"
"\n bad input\n", chvlist, ilist) ;
}
return(chvlist->heads[ilist] != NULL) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------------
return 1 if the count for list ilist is zero
return 0 if the count for list ilist is greater than zero
created -- 98may02, cca
---------------------------------------------------------
*/
int
ChvList_isCountZero (
ChvList *chvlist,
int ilist
) {
/*
---------------
check the input
---------------
*/
if ( chvlist == NULL || ilist < 0 || ilist >= chvlist->nlist ) {
fprintf(stderr, "\n fatal error in ChvList_isCountZero(%p,%d)"
"\n bad input\n", chvlist, ilist) ;
}
if ( chvlist->counts == NULL ) {
return(1) ;
} else {
return(chvlist->counts[ilist] == 0) ;
}
}
/*--------------------------------------------------------------------*/
/*
---------------------------------
if chv is not NULL then
add chv to list ilist
endif
decrement the count of list ilist
created -- 98may02, cca
---------------------------------
*/
void
ChvList_addObjectToList (
ChvList *chvlist,
Chv *chv,
int ilist
) {
/*
---------------
check the input
---------------
*/
if ( chvlist == NULL || ilist < 0 || ilist >= chvlist->nlist ) {
fprintf(stderr,
"\n fatal error in ChvList_addObjectToList(%p,%p,%d)"
"\n bad input\n", chvlist, chv, ilist) ;
exit(-1) ;
}
#if MYDEBUG > 0
fprintf(stdout, "\n ChvList %p : adding chv %p to list %d",
chvlist, chv, ilist) ;
fflush(stdout) ;
#endif
if ( chvlist->lock != NULL
&& (chvlist->flags == NULL || chvlist->flags[ilist] == 'Y' ) ) {
/*
--------------------------------------------------
we must lock the list to (possibly) add the object
and decrement the list's count
--------------------------------------------------
*/
Lock_lock(chvlist->lock) ;
if ( chv != NULL ) {
chv->next = chvlist->heads[ilist] ;
chvlist->heads[ilist] = chv ;
}
if ( chvlist->counts != NULL ) {
chvlist->counts[ilist]-- ;
}
chvlist->nlocks++ ;
Lock_unlock(chvlist->lock) ;
} else {
/*
---------------------------------------------
no need to lock the list, just (possibly)
add the object and decrement the list's count
---------------------------------------------
*/
if ( chv != NULL ) {
chv->next = chvlist->heads[ilist] ;
chvlist->heads[ilist] = chv ;
}
if ( chvlist->counts != NULL ) {
chvlist->counts[ilist]-- ;
}
}
#if MYDEBUG > 0
fprintf(stdout, "\n ChvList %p : heads[%d] = %p, counts[%d] = %d",
chvlist, ilist, chvlist->heads[ilist],
ilist, chvlist->counts[ilist]) ;
fflush(stdout) ;
#endif
return ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------
return pointer to head of list ilist
and set head to NULL
created -- 98may02, cca
------------------------------------
*/
Chv *
ChvList_getList (
ChvList *chvlist,
int ilist
) {
Chv *chv ;
/*
---------------
check the input
---------------
*/
if ( chvlist == NULL || ilist < 0 || ilist >= chvlist->nlist ) {
fprintf(stderr,
"\n fatal error in ChvList_getList(%p,%d)"
"\n bad input\n", chvlist, ilist) ;
exit(-1) ;
}
#if MYDEBUG > 0
fprintf(stdout, "\n ChvList %p : get list %d", chvlist, ilist) ;
fflush(stdout) ;
#endif
if ( chvlist->heads[ilist] != NULL ) {
if ( chvlist->lock == NULL
|| (chvlist->flags != NULL && chvlist->flags[ilist] == 'N')
|| (chvlist->counts != NULL && chvlist->counts[ilist] == 0) ) {
/*
------------------------
no need to lock the list
------------------------
*/
chv = chvlist->heads[ilist] ;
chvlist->heads[ilist] = NULL ;
} else {
/*
----------------------------------------------------
we must lock the list to return the head of the list
----------------------------------------------------
*/
Lock_lock(chvlist->lock) ;
chv = chvlist->heads[ilist] ;
chvlist->heads[ilist] = NULL ;
chvlist->nlocks++ ;
Lock_unlock(chvlist->lock) ;
}
} else {
chv = NULL ;
}
#if MYDEBUG > 0
fprintf(stdout, "\n ChvList %p : chv %p", chvlist, chv) ;
fflush(stdout) ;
#endif
return(chv) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1