IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 24, 2020, 3:19:09 PM (6 years ago)
Author:
eugene
Message:

adding string-type vectors to opihi

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/lib.shell/VectorOps.c

    r39640 r41269  
    129129  if (mode == NEWVECTOR) goto error;
    130130  if (vectors[i]) {
     131    // XXX warning: this will be a leak if vector is type OPIHI_STR
    131132    if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr);
    132133    free (vectors[i]);
     
    150151  if (i == Nvectors) return (FALSE);
    151152
     153  // XXX warning: this will be a leak if vector is type OPIHI_STR
    152154  if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr);
    153155  free (vectors[i]);
     
    170172  if (i == Nvectors) return (FALSE);
    171173
     174  // XXX warning: this will be a leak if vector is type OPIHI_STR
    172175  if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr);
    173176  free (vectors[i]);
     
    191194
    192195int CopyVector (Vector *out, Vector *in) {
     196  // XXX warning: this will be a leak if vector is type OPIHI_STR
    193197  if (out[0].elements.Ptr) free (out[0].elements.Ptr);
    194198  out[0].Nelements = in[0].Nelements;
     
    208212
    209213int MatchVector(Vector *out, Vector *in, char type) {
     214  // XXX warning: this will be a leak if vector is type OPIHI_STR
    210215  if (out[0].elements.Ptr) free (out[0].elements.Ptr);
    211216  out[0].Nelements = in[0].Nelements;
     
    222227int ResetVector (Vector *vec, char type, int Nelements) {
    223228
     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
    224237  // a vector can only have >= 0 elements
    225238  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;
    232253  }
    233254  return TRUE;
     
    251272
    252273// SetVector (vecx, OPIHI_FLT, MAX (Npts, 1));
     274// Use this for an unallocated vector (e.g., static variable)
    253275int SetVector (Vector *vec, char type, int Nelements) {
    254276
    255277  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;
    262292  }
    263293  return TRUE;
     
    272302  if (vec[0].type == type) return TRUE;
    273303
    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;
    296335  }
    297336  return TRUE;
     
    342381  gprint (GP_LOG, "    N       name      size\n");
    343382  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;
    348393    }
    349394  }
Note: See TracChangeset for help on using the changeset viewer.