/* subIVL.c */
#include "../IVL.h"
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------------
purpose -- initialize subIVL from ivl
if keeplistIV is not NULL then
keeplistIV contains the lists of ivl to be placed in subIVL
else
all lists are placed in subIVL
endif
if keepentriesIV is not NULL then
keepentriesIV contains the entries in the lists to be kept
else
all entries in the kept lists are placed in subIVL
endif
return value ---
1 -- normal return
-1 -- subIVL is NULL
-2 -- ivl is NULL
-3 -- keeplistIV is invalid
created -- 98oct16, cca
----------------------------------------------------------------
*/
int
IVL_initFromSubIVL (
IVL *subIVL,
IVL *ivl,
IV *keeplistIV,
IV *keepentriesIV
) {
int count, ii, ikeep, ilist, maxlistsize, maxval, nkeep, nkeepent,
nlist, size, val ;
int *keepent, *keeplist, *list, *map, *temp ;
/*
---------------
check the input
---------------
*/
if ( subIVL == NULL ) {
fprintf(stderr, "\n error in IVL_initFromSubIVL()"
"\n subIVL is NULL\n") ;
return(-1) ;
}
if ( ivl == NULL ) {
fprintf(stderr, "\n error in IVL_initFromSubIVL()"
"\n ivl is NULL\n") ;
return(-2) ;
}
nlist = ivl->nlist ;
if ( keeplistIV != NULL ) {
IV_sizeAndEntries(keeplistIV, &nkeep, &keeplist) ;
if ( nkeep < 0 || keeplist == NULL ) {
fprintf(stderr, "\n error in IVL_initFromSubIVL()"
"\n invalid keeplistIV, nkeep %d, keeplist %p\n",
nkeep, keeplist) ;
return(-3) ;
}
for ( ii = 0 ; ii < nkeep ; ii++ ) {
if ( (val = keeplist[ii]) < 0 || val >= nlist ) {
fprintf(stderr, "\n error in IVL_initFromSubIVL()"
"\n invalid keeplistIV, keeplist[%d] = %d, nlist %d\n",
ii, val, nlist) ;
return(-3) ;
}
}
} else {
nkeep = nlist ;
keeplist = IVinit(nkeep, -1) ;
IVramp(nkeep, keeplist, 0, 1) ;
}
if ( keepentriesIV != NULL ) {
IV_sizeAndEntries(keepentriesIV, &nkeepent, &keepent) ;
maxval = IVL_max(ivl) ;
if ( maxval >= 0 ) {
map = IVinit(1 + maxval, -1) ;
for ( ii = 0 ; ii < nkeepent ; ii++ ) {
if ( (val = keepent[ii]) >= 0 ) {
map[val] = ii ;
}
}
maxlistsize = IVL_maxListSize(ivl) ;
temp = IVinit(maxlistsize, -1) ;
} else {
map = NULL ;
}
} else {
map = NULL ;
}
/*
----------------------------
initialize the subIVL object
----------------------------
*/
IVL_init1(subIVL, IVL_CHUNKED, nkeep) ;
/*
-----------------------------------
fill the lists of the subIVL object
-----------------------------------
*/
for ( ikeep = 0 ; ikeep < nkeep ; ikeep++ ) {
ilist = keeplist[ikeep] ;
IVL_listAndSize(ivl, ilist, &size, &list) ;
if ( map == NULL ) {
IVL_setList(subIVL, ikeep, size, list) ;
} else {
for ( ii = count = 0 ; ii < size ; ii++ ) {
if ( (val = map[list[ii]]) != -1 ) {
temp[count++] = val ;
}
}
IVL_setList(subIVL, ikeep, count, temp) ;
}
}
/*
------------------------
free the working storage
------------------------
*/
if ( keeplistIV == NULL ) {
IVfree(keeplist) ;
}
if ( map != NULL ) {
IVfree(map) ;
IVfree(temp) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1