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