1 /*  subIVL.c  */
2 
3 #include "../IVL.h"
4 
5 /*--------------------------------------------------------------------*/
6 /*
7    ----------------------------------------------------------------
8    purpose -- initialize subIVL from ivl
9      if keeplistIV is not NULL then
10         keeplistIV contains the lists of ivl to be placed in subIVL
11      else
12         all lists are placed in subIVL
13      endif
14      if keepentriesIV is not NULL then
15         keepentriesIV contains the entries in the lists to be kept
16      else
17         all entries in the kept lists are placed in subIVL
18      endif
19 
20    return value ---
21       1 -- normal return
22      -1 -- subIVL is NULL
23      -2 -- ivl is NULL
24      -3 -- keeplistIV is invalid
25 
26    created -- 98oct16, cca
27    ----------------------------------------------------------------
28 */
29 int
IVL_initFromSubIVL(IVL * subIVL,IVL * ivl,IV * keeplistIV,IV * keepentriesIV)30 IVL_initFromSubIVL (
31    IVL   *subIVL,
32    IVL   *ivl,
33    IV    *keeplistIV,
34    IV    *keepentriesIV
35 ) {
36 int   count, ii, ikeep, ilist, maxlistsize, maxval, nkeep, nkeepent,
37       nlist, size, val ;
38 int   *keepent, *keeplist, *list, *map, *temp ;
39 /*
40    ---------------
41    check the input
42    ---------------
43 */
44 if ( subIVL == NULL ) {
45    fprintf(stderr, "\n error in IVL_initFromSubIVL()"
46            "\n subIVL is NULL\n") ;
47    return(-1) ;
48 }
49 if ( ivl == NULL ) {
50    fprintf(stderr, "\n error in IVL_initFromSubIVL()"
51            "\n ivl is NULL\n") ;
52    return(-2) ;
53 }
54 nlist = ivl->nlist ;
55 if ( keeplistIV != NULL ) {
56    IV_sizeAndEntries(keeplistIV, &nkeep, &keeplist) ;
57    if ( nkeep < 0 || keeplist == NULL ) {
58       fprintf(stderr, "\n error in IVL_initFromSubIVL()"
59               "\n invalid keeplistIV, nkeep %d, keeplist %p\n",
60               nkeep, keeplist) ;
61       return(-3) ;
62    }
63    for ( ii = 0 ; ii < nkeep ; ii++ ) {
64       if ( (val = keeplist[ii]) < 0 || val >= nlist ) {
65          fprintf(stderr, "\n error in IVL_initFromSubIVL()"
66                  "\n invalid keeplistIV, keeplist[%d] = %d, nlist %d\n",
67                  ii, val, nlist) ;
68          return(-3) ;
69       }
70    }
71 } else {
72    nkeep = nlist ;
73    keeplist = IVinit(nkeep, -1) ;
74    IVramp(nkeep, keeplist, 0, 1) ;
75 }
76 if ( keepentriesIV != NULL ) {
77    IV_sizeAndEntries(keepentriesIV, &nkeepent, &keepent) ;
78    maxval = IVL_max(ivl) ;
79    if ( maxval >= 0 ) {
80       map = IVinit(1 + maxval, -1) ;
81       for ( ii = 0 ; ii < nkeepent ; ii++ ) {
82          if ( (val = keepent[ii]) >= 0 ) {
83             map[val] = ii ;
84          }
85       }
86       maxlistsize = IVL_maxListSize(ivl) ;
87       temp = IVinit(maxlistsize, -1) ;
88    } else {
89       map = NULL ;
90    }
91 } else {
92    map = NULL ;
93 }
94 /*
95    ----------------------------
96    initialize the subIVL object
97    ----------------------------
98 */
99 IVL_init1(subIVL, IVL_CHUNKED, nkeep) ;
100 /*
101    -----------------------------------
102    fill the lists of the subIVL object
103    -----------------------------------
104 */
105 for ( ikeep = 0 ; ikeep < nkeep ; ikeep++ ) {
106    ilist = keeplist[ikeep] ;
107    IVL_listAndSize(ivl, ilist, &size, &list) ;
108    if ( map == NULL ) {
109       IVL_setList(subIVL, ikeep, size, list) ;
110    } else {
111       for ( ii = count = 0 ; ii < size ; ii++ ) {
112          if ( (val = map[list[ii]]) != -1 ) {
113             temp[count++] = val ;
114          }
115       }
116       IVL_setList(subIVL, ikeep, count, temp) ;
117    }
118 }
119 /*
120    ------------------------
121    free the working storage
122    ------------------------
123 */
124 if ( keeplistIV == NULL ) {
125    IVfree(keeplist) ;
126 }
127 if ( map != NULL ) {
128    IVfree(map) ;
129    IVfree(temp) ;
130 }
131 return(1) ; }
132 
133 /*--------------------------------------------------------------------*/
134