Changeset 41269 for trunk/Ohana/src/opihi/lib.shell/VectorOps.c
- Timestamp:
- Feb 24, 2020, 3:19:09 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/lib.shell/VectorOps.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/lib.shell/VectorOps.c
r39640 r41269 129 129 if (mode == NEWVECTOR) goto error; 130 130 if (vectors[i]) { 131 // XXX warning: this will be a leak if vector is type OPIHI_STR 131 132 if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr); 132 133 free (vectors[i]); … … 150 151 if (i == Nvectors) return (FALSE); 151 152 153 // XXX warning: this will be a leak if vector is type OPIHI_STR 152 154 if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr); 153 155 free (vectors[i]); … … 170 172 if (i == Nvectors) return (FALSE); 171 173 174 // XXX warning: this will be a leak if vector is type OPIHI_STR 172 175 if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr); 173 176 free (vectors[i]); … … 191 194 192 195 int CopyVector (Vector *out, Vector *in) { 196 // XXX warning: this will be a leak if vector is type OPIHI_STR 193 197 if (out[0].elements.Ptr) free (out[0].elements.Ptr); 194 198 out[0].Nelements = in[0].Nelements; … … 208 212 209 213 int MatchVector(Vector *out, Vector *in, char type) { 214 // XXX warning: this will be a leak if vector is type OPIHI_STR 210 215 if (out[0].elements.Ptr) free (out[0].elements.Ptr); 211 216 out[0].Nelements = in[0].Nelements; … … 222 227 int ResetVector (Vector *vec, char type, int Nelements) { 223 228 229 // if the supplied vector is a string but the output is not a string, we need to free 230 // the unused elements 231 if ((vec[0].type == OPIHI_STR) && (vec[0].type != type)) { 232 for (int i = 0; i < vec[0].Nelements; i++) { 233 FREE (vec[0].elements.Str[i]); 234 } 235 } 236 224 237 // a vector can only have >= 0 elements 225 238 vec[0].Nelements = MAX(Nelements,0); 226 if (type == OPIHI_FLT) { 227 REALLOCATE (vec[0].elements.Flt, opihi_flt, MAX(1, Nelements)); 228 vec[0].type = OPIHI_FLT; 229 } else { 230 REALLOCATE (vec[0].elements.Int, opihi_int, MAX(1, Nelements)); 231 vec[0].type = OPIHI_INT; 239 240 switch (type) { 241 case OPIHI_FLT: 242 REALLOCATE (vec[0].elements.Flt, opihi_flt, MAX(1, Nelements)); 243 vec[0].type = OPIHI_FLT; 244 break; 245 case OPIHI_INT: 246 REALLOCATE (vec[0].elements.Int, opihi_int, MAX(1, Nelements)); 247 vec[0].type = OPIHI_INT; 248 break; 249 case OPIHI_STR: 250 REALLOCATE (vec[0].elements.Str, char *, MAX(1, Nelements)); 251 vec[0].type = OPIHI_STR; 252 break; 232 253 } 233 254 return TRUE; … … 251 272 252 273 // SetVector (vecx, OPIHI_FLT, MAX (Npts, 1)); 274 // Use this for an unallocated vector (e.g., static variable) 253 275 int SetVector (Vector *vec, char type, int Nelements) { 254 276 255 277 vec[0].Nelements = MAX(Nelements,0); 256 if (type == OPIHI_FLT) { 257 ALLOCATE (vec[0].elements.Flt, opihi_flt, MAX(1,Nelements)); 258 vec[0].type = OPIHI_FLT; 259 } else { 260 ALLOCATE (vec[0].elements.Int, opihi_int, MAX(1,Nelements)); 261 vec[0].type = OPIHI_INT; 278 279 switch (type) { 280 case OPIHI_FLT: 281 ALLOCATE (vec[0].elements.Flt, opihi_flt, MAX(1,Nelements)); 282 vec[0].type = OPIHI_FLT; 283 break; 284 case OPIHI_INT: 285 ALLOCATE (vec[0].elements.Int, opihi_int, MAX(1,Nelements)); 286 vec[0].type = OPIHI_INT; 287 break; 288 case OPIHI_STR: 289 ALLOCATE (vec[0].elements.Ptr, char *, MAX(1,Nelements)); 290 vec[0].type = OPIHI_STR; 291 break; 262 292 } 263 293 return TRUE; … … 272 302 if (vec[0].type == type) return TRUE; 273 303 274 if (type == OPIHI_FLT) { 275 opihi_flt *temp; 276 ALLOCATE (temp, opihi_flt, vec[0].Nelements); 277 opihi_flt *vo = temp; 278 opihi_int *vi = vec[0].elements.Int; 279 for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) { 280 *vo = *vi; 281 } 282 free (vec[0].elements.Int); 283 vec[0].elements.Flt = temp; 284 vec[0].type = OPIHI_FLT; 285 } else { 286 opihi_int *temp; 287 ALLOCATE (temp, opihi_int, vec[0].Nelements); 288 opihi_int *vo = temp; 289 opihi_flt *vi = vec[0].elements.Flt; 290 for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) { 291 *vo = *vi; 292 } 293 free (vec[0].elements.Flt); 294 vec[0].elements.Int = temp; 295 vec[0].type = OPIHI_INT; 304 switch (type) { 305 case OPIHI_FLT: { 306 opihi_flt *temp; 307 ALLOCATE (temp, opihi_flt, vec[0].Nelements); 308 opihi_flt *vo = temp; 309 opihi_int *vi = vec[0].elements.Int; 310 for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) { 311 *vo = *vi; 312 } 313 free (vec[0].elements.Int); 314 vec[0].elements.Flt = temp; 315 vec[0].type = OPIHI_FLT; 316 break; 317 } 318 case OPIHI_INT: { 319 opihi_int *temp; 320 ALLOCATE (temp, opihi_int, vec[0].Nelements); 321 opihi_int *vo = temp; 322 opihi_flt *vi = vec[0].elements.Flt; 323 for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) { 324 *vo = *vi; 325 } 326 free (vec[0].elements.Flt); 327 vec[0].elements.Int = temp; 328 vec[0].type = OPIHI_INT; 329 break; 330 } 331 case OPIHI_STR: 332 default: 333 // does it make sense to cast an int/flt vector to string? 334 break; 296 335 } 297 336 return TRUE; … … 342 381 gprint (GP_LOG, " N name size\n"); 343 382 for (i = 0; i < Nvectors; i++) { 344 if (vectors[i][0].type == OPIHI_FLT) { 345 gprint (GP_LOG, "%5d %10s %10d (FLT)\n", i, vectors[i][0].name, vectors[i][0].Nelements); 346 } else { 347 gprint (GP_LOG, "%5d %10s %10d (INT)\n", i, vectors[i][0].name, vectors[i][0].Nelements); 383 switch (vectors[i][0].type) { 384 case OPIHI_FLT: 385 gprint (GP_LOG, "%5d %10s %10d (FLT)\n", i, vectors[i][0].name, vectors[i][0].Nelements); 386 break; 387 case OPIHI_INT: 388 gprint (GP_LOG, "%5d %10s %10d (INT)\n", i, vectors[i][0].name, vectors[i][0].Nelements); 389 break; 390 case OPIHI_STR: 391 gprint (GP_LOG, "%5d %10s %10d (STR)\n", i, vectors[i][0].name, vectors[i][0].Nelements); 392 break; 348 393 } 349 394 }
Note:
See TracChangeset
for help on using the changeset viewer.
