changed all floats to double
[dyninst.git] / visi / src / mrlist.C
1 /* $Log: mrlist.C,v $
2 /* Revision 1.2  1994/03/14 20:28:49  newhall
3 /* changed visi subdirectory structure
4 /*  */ 
5 #include "visi/h/mrlist.h" 
6 /////////////////// method functions for class visi_MRList
7
8 visi_MRList::visi_MRList(int size,int wCard,char *members){
9
10 int i,j,k;
11 int wordsize;
12 int wch;
13
14   if((size > 0) && (members != NULL)){
15     numElements = size; 
16     if((list=(visi_mrListType *)malloc(sizeof(visi_mrListType)*numElements)) 
17         == NULL){
18       perror("Error in visi_MRList constructor");
19     }
20     i=j=wch=0;
21     while((members[i] != '\0') && (wch < numElements)){
22       while((members[i] != ',') && (members[i] != '\0')){
23          i++;
24       }
25       wordsize = i-j+1;
26       if((list[wch].list = (char *)malloc(sizeof(char)*wordsize))==NULL){
27         perror("Error in visi_MRList constructor");
28       }
29       for(k=0;k<wordsize;k++){
30         list[wch].list[k] = '\0';
31       }
32       if((strncpy(list[wch].list,&members[j],wordsize-1)) == NULL){
33         perror("Error in visi_MRList constructor");
34       }
35       list[wch].size = wordsize -1;
36       j = i+1;
37       if(members[i] != '\0') i++;
38       wch++;
39     }
40   }
41   listSize = numElements;
42   if(wCard)
43     wildCard = 1;
44   else
45     wildCard = 0;
46 }
47
48
49 visi_MRList::visi_MRList(int size,class metricType *metrics){
50
51 int i,k,nameLength;
52
53   if((size > 0) && (metrics != NULL)){
54     numElements = size;
55     if((list=(visi_mrListType *)malloc(sizeof(visi_mrListType)*numElements)) 
56         == NULL){
57       visi_ErrorHandler(ERROR_MALLOC,"Error in visi_MRList constructor");
58     }
59     for(i=0;i<numElements;i++){
60       nameLength = strlen(metrics[i].name);
61       if((list[i].list = (char *)malloc(sizeof(char)*(nameLength+1)))==NULL){
62         visi_ErrorHandler(ERROR_MALLOC,"Error in visi_MRList constructor");
63       }
64       for(k=0;k<nameLength+1;k++){
65         list[i].list[k] = '\0';
66       }
67       if((strncpy(list[i].list,metrics[i].name,nameLength)) == NULL){
68         visi_ErrorHandler(ERROR_STRNCPY,"Error in visi_MRList constructor");
69       }
70       list[i].list[nameLength] = '\0';
71     }
72     listSize = numElements;
73   }
74 }
75
76
77 visi_MRList::visi_MRList(int size,class resourceType *resources){
78
79 int i,k,nameLength;
80
81   if((size > 0) && (resources != NULL)){
82     numElements = size;
83     if((list=(visi_mrListType *)malloc(sizeof(visi_mrListType)*numElements)) 
84         == NULL){
85       visi_ErrorHandler(ERROR_MALLOC,"Error in visi_MRList constructor");
86     }
87     for(i=0;i<numElements;i++){
88       nameLength = strlen(resources[i].name);
89       if((list[i].list = (char *)malloc(sizeof(char)*(nameLength+1)))==NULL){
90         visi_ErrorHandler(ERROR_MALLOC,"Error in visi_MRList constructor");
91       }
92       for(k=0;k<nameLength+1;k++){
93         list[i].list[k] = '\0';
94       }
95       if((strncpy(list[i].list,resources[i].name,nameLength)) == NULL){
96         visi_ErrorHandler(ERROR_STRNCPY,"Error in visi_MRList constructor");
97       }
98       list[i].list[nameLength] = '\0';
99     }
100     listSize = numElements;
101   }
102
103 }
104
105
106 visi_MRList::~visi_MRList(){
107   int i;
108
109   for(i = 0; i < listSize; i++)
110     if(list[i].list != NULL)
111       free(list[i].list);
112   free(list);
113
114 }
115
116 int visi_MRList::AddElements(int num,char *elements){
117
118 int i,j,k;
119 int start,end;
120 int size;
121 int wordsize;
122 int wch;
123
124 if(!numElements){
125   if((list=(visi_mrListType *)malloc(sizeof(visi_mrListType)*num))==NULL){
126     visi_ErrorHandler(ERROR_MALLOC,"visi_MRList::AddElements");
127     perror("Error in AddElements");
128     return(ERROR_MALLOC);
129   }
130   start = 0;
131   end   = num;
132 }
133 else{
134  size = numElements + num;
135  if((list=(visi_mrListType *)realloc(list,sizeof(visi_mrListType)*size))==NULL){
136     perror("Error in AddElements");
137     visi_ErrorHandler(ERROR_MALLOC,"visi_MRList::AddElements");
138     return(ERROR_MALLOC);
139  }
140  start = numElements;
141  end   = numElements+num;
142 }
143
144 if((num > 0) &&(elements != NULL)){
145   i=j=wch=0;
146   while((elements[i] != '\0') && (wch < num)){
147     while((elements[i] != ',') && (elements[i] != '\0')){
148        i++;
149     }
150     wordsize = i-j+1;
151     if((list[start].list = (char *)malloc(sizeof(char)*wordsize)) == NULL){
152       perror("Error in AddElements");
153       visi_ErrorHandler(ERROR_MALLOC,"visi_MRList::AddElements");
154       return(ERROR_MALLOC);
155     }
156     for(k=0;k<wordsize;k++){
157       list[start].list[k] = '\0';
158     }
159     if((strncpy(list[start].list,&elements[j],wordsize-1)) == NULL){
160       perror("Error in AddElements");
161       visi_ErrorHandler(ERROR_STRNCPY,"visi_MRList::AddElements");
162       return(ERROR_STRNCPY);
163     }
164     list[start].size = wordsize -1;
165     j = i+1;
166     if(elements[i] != '\0') i++;
167     wch++;
168     start++;
169   }
170   numElements += num;
171 }
172 listSize = numElements;
173 return(OK);
174 }
175
176 void visi_MRList::Print(){
177
178 int i;
179
180   fprintf(stderr,"number of elements in list: %d\n",numElements);
181   for(i=0; i < numElements; i++){
182     fprintf(stderr,"list element %d: %s\n",i,list[i].list); 
183   }
184   if(wildCard)
185     fprintf(stderr,"list element %d: wildCard\n",i);
186 }
187
188
189 int visi_MRList::RemoveElement(int elmNum){
190
191 int i;
192
193   if((elmNum < 0) || (elmNum >= numElements)){
194      visi_ErrorHandler(ERROR_NOELM,"visi_MRList::RemoveElement"); 
195      return(ERROR_NOELM);
196   }
197
198   free(list[elmNum].list);
199   for(i = elmNum; i < (numElements-1); i++)
200     list[i] = list[i+1];
201   numElements--;
202   return(OK);
203 }
204
205 int visi_MRList::CreateMRList(char **elements){
206
207 int  totalSize = 0;
208 int  i,j;
209   
210   for(i=0; i < numElements; i++){
211     totalSize += list[i].size;
212   }
213   totalSize += numElements; //add extra space for commas
214   if(wildCard)
215     totalSize += 2;
216   if(((*elements) = (char *)malloc(sizeof(char)*totalSize)) == NULL){
217     perror("error in CreateMRList\n");
218     visi_ErrorHandler(ERROR_MALLOC,"visi_MRList::CreateMRList"); 
219     return(ERROR_MALLOC);
220   }
221   for(i=0;i<totalSize;i++){
222     (*elements)[i] = '\0';
223   }
224   j=0;
225   for(i=0; i < numElements; i++){
226     if(j < totalSize)
227       if((strncpy(&((*elements)[j]),list[i].list,list[i].size))==NULL){
228         perror("error in CreateMRList\n");
229         visi_ErrorHandler(ERROR_STRNCPY,"visi_MRList::CreateMRList"); 
230         return(ERROR_STRNCPY);
231       }
232     j += list[i].size;
233     if(i < (numElements-1)){
234       if((strncpy(&((*elements)[j]),",",1))==NULL){
235         perror("error in CreateMRList\n");
236         visi_ErrorHandler(ERROR_STRNCPY,"visi_MRList::CreateMRList"); 
237         return(ERROR_STRNCPY);
238       }
239       j++;
240     }
241   }
242   if((wildCard) && (j<totalSize)){
243     if((strncpy(&((*elements)[j]),",*",2))==NULL){
244         perror("error in CreateMRList\n");
245         visi_ErrorHandler(ERROR_STRNCPY,"visi_MRList::CreateMRList"); 
246         return(ERROR_STRNCPY);
247     }
248     j +=2;
249   }
250   if(j<totalSize){
251    if((strncpy(&((*elements)[j]),"\0",1))==NULL){
252         perror("error in CreateMRList\n");
253         visi_ErrorHandler(ERROR_STRNCPY,"visi_MRList::CreateMRList"); 
254         return(ERROR_STRNCPY);
255    }
256   }
257
258   return(OK);
259 }