Changeset 41269
- Timestamp:
- Feb 24, 2020, 3:19:09 PM (6 years ago)
- Location:
- trunk/Ohana/src
- Files:
-
- 13 edited
-
libdvo/include/dvodb.h (modified) (1 diff)
-
libkapa/rotfont/helvetica12.h (modified) (3 diffs)
-
opihi/cmd.astro/cgrid.c (modified) (1 diff)
-
opihi/cmd.data/create.c (modified) (2 diffs)
-
opihi/cmd.data/list_vectors.c (modified) (1 diff)
-
opihi/cmd.data/print_vectors.c (modified) (1 diff)
-
opihi/cmd.data/read_vectors.c (modified) (10 diffs)
-
opihi/cmd.data/rotate.c (modified) (1 diff)
-
opihi/cmd.data/tvcolors.c (modified) (1 diff)
-
opihi/cmd.data/write_vectors.c (modified) (5 diffs)
-
opihi/include/dvomath.h (modified) (3 diffs)
-
opihi/lib.shell/VectorIO.c (modified) (6 diffs)
-
opihi/lib.shell/VectorOps.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/libdvo/include/dvodb.h
r40463 r41269 5 5 6 6 // Some values used by code moved to libdvo from opihi. 7 enum {OPIHI_NOTYPE, OPIHI_FLT, OPIHI_INT}; 7 typedef enum {OPIHI_NOTYPE, OPIHI_FLT, OPIHI_INT, OPIHI_STR} opihiVectorTypes; 8 8 9 # define opihi_flt double 9 // # define opihi_int int64_t10 10 # define opihi_int long long int 11 11 # define OPIHI_INT_FMT "%lld" 12 13 // # define opihi_int int64_t 12 14 13 15 typedef enum { -
trunk/Ohana/src/libkapa/rotfont/helvetica12.h
r40629 r41269 565 565 { 9, 9, 10.67, 9, helvetica12_37_bits}, 566 566 { 7, 9, 8.00, 9, helvetica12_38_bits}, 567 { 2, 3, 2.6 5, 9, helvetica12_39_bits},567 { 2, 3, 2.66, 9, helvetica12_39_bits}, 568 568 { 3, 12, 3.99, 9, helvetica12_40_bits}, 569 569 { 3, 12, 3.99, 9, helvetica12_41_bits}, … … 752 752 { 6, 10, 0.00, 10, helvetica12_224_bits}, 753 753 { 6, 10, 0.00, 10, helvetica12_225_bits}, 754 { 6, 10, 0.00, 10, helvetica12_226_bits},754 { 6, 10, -5708879119777792.00, 10, helvetica12_226_bits}, 755 755 { 6, 10, 0.00, 10, helvetica12_227_bits}, 756 { 6, 9, 0.00, 9, helvetica12_228_bits},756 { 6, 9, -5709290899767296.00, 9, helvetica12_228_bits}, 757 757 { 6, 10, 0.00, 10, helvetica12_229_bits}, 758 { 9, 7, 0.00, 7, helvetica12_230_bits},759 { 5, 10, 0.00, 7, helvetica12_231_bits},758 { 9, 7, -365774995456.00, 7, helvetica12_230_bits}, 759 { 5, 10, -439036674048.00, 7, helvetica12_231_bits}, 760 760 { 5, 10, 0.00, 10, helvetica12_232_bits}, 761 { 5, 10, 0.00, 10, helvetica12_233_bits},761 { 5, 10, -5710030171013120.00, 10, helvetica12_233_bits}, 762 762 { 5, 10, 0.00, 10, helvetica12_234_bits}, 763 { 5, 9, 0.00, 9, helvetica12_235_bits},763 { 5, 9, -5712675870867456.00, 9, helvetica12_235_bits}, 764 764 { 2, 10, 0.00, 10, helvetica12_236_bits}, 765 765 { 2, 10, 0.00, 10, helvetica12_237_bits}, … … 767 767 { 3, 9, 0.00, 9, helvetica12_239_bits}, 768 768 { 5, 10, 0.00, 10, helvetica12_240_bits}, 769 { 5, 10, 0.00, 10, helvetica12_241_bits},769 { 5, 10, -0.00, 10, helvetica12_241_bits}, 770 770 { 5, 10, 0.00, 10, helvetica12_242_bits}, 771 771 { 5, 10, 0.00, 10, helvetica12_243_bits}, 772 { 5, 10, 0.00, 10, helvetica12_244_bits},773 { 5, 10, 0.00, 10, helvetica12_245_bits},772 { 5, 10, -5710012991143936.00, 10, helvetica12_244_bits}, 773 { 5, 10, -5710012991143936.00, 10, helvetica12_245_bits}, 774 774 { 5, 9, 0.00, 9, helvetica12_246_bits}, 775 775 { 5, 5, 0.00, 6, helvetica12_247_bits}, 776 776 { 7, 7, 0.00, 7, helvetica12_248_bits}, 777 { 5, 10, 0.00, 10, helvetica12_249_bits},777 { 5, 10, -439038246912.00, 10, helvetica12_249_bits}, 778 778 { 5, 10, 0.00, 10, helvetica12_250_bits}, 779 779 { 5, 10, 0.00, 10, helvetica12_251_bits}, -
trunk/Ohana/src/opihi/cmd.astro/cgrid.c
r40625 r41269 182 182 } 183 183 } 184 184 185 185 186 /* set spacings for DEC */ -
trunk/Ohana/src/opihi/cmd.data/create.c
r40015 r41269 7 7 Vector *vec; 8 8 9 // create a vector of empty strings 10 if ((N = get_argument (argc, argv, "-str"))) { 11 remove_argument (N, &argc, argv); 12 13 char *stringValue = NULL; 14 if ((N = get_argument (argc, argv, "-value"))) { 15 remove_argument (N, &argc, argv); 16 stringValue = strcreate (argv[N]); 17 remove_argument (N, &argc, argv); 18 } 19 20 if (argc != 3) { 21 gprint (GP_ERR, "USAGE: create vector Nelements -value word\n"); 22 return (FALSE); 23 } 24 25 if ((vec = SelectVector (argv[1], ANYVECTOR, TRUE)) == NULL) return (FALSE); 26 int Nelements = atoi (argv[2]); 27 28 // a newly reset vector has NULL-valued pointers 29 ResetVector (vec, OPIHI_STR, Nelements); 30 for (int i = 0; i < Nelements; i++) { 31 vec[0].elements.Str[i] = stringValue ? strcreate (stringValue) : strcreate (""); 32 } 33 return TRUE; 34 } 35 9 36 INT = FALSE; 10 37 if ((N = get_argument (argc, argv, "-int"))) { … … 16 43 gprint (GP_ERR, "USAGE: create vector start end [delta] [-int]\n"); 17 44 gprint (GP_ERR, " -int : resulting vector is integer type (delta must be integer)\n"); 45 gprint (GP_ERR, " -str : resulting vector is string type (only give number of elements)\n"); 18 46 return (FALSE); 19 47 } -
trunk/Ohana/src/opihi/cmd.data/list_vectors.c
r39457 r41269 32 32 } 33 33 34 if (vec->type == OPIHI_FLT) { 35 if (Variable) { 36 set_str_variable (Variable, "FLT"); 37 } else { 38 gprint (GP_LOG, "%s : FLT\n", argv[1]); 39 } 40 } else { 41 if (Variable) { 42 set_str_variable (Variable, "INT"); 43 } else { 44 gprint (GP_LOG, "%s : INT\n", argv[1]); 45 } 34 switch (vec->type) { 35 case OPIHI_FLT: 36 if (Variable) { 37 set_str_variable (Variable, "FLT"); 38 } else { 39 gprint (GP_LOG, "%s : FLT\n", argv[1]); 40 } 41 break; 42 case OPIHI_INT: 43 if (Variable) { 44 set_str_variable (Variable, "INT"); 45 } else { 46 gprint (GP_LOG, "%s : INT\n", argv[1]); 47 } 48 break; 49 case OPIHI_STR: 50 if (Variable) { 51 set_str_variable (Variable, "STR"); 52 } else { 53 gprint (GP_LOG, "%s : STR\n", argv[1]); 54 } 55 break; 46 56 } 47 57 if (Variable) free (Variable); -
trunk/Ohana/src/opihi/cmd.data/print_vectors.c
r40545 r41269 56 56 if (vec[i][0].type == OPIHI_FLT) { 57 57 gprint (GP_LOG, "%f ", vec[i][0].elements.Flt[j]); 58 } else { 58 } 59 if (vec[i][0].type == OPIHI_INT) { 59 60 gprint (GP_LOG, OPIHI_INT_FMT" ", vec[i][0].elements.Int[j]); 60 } 61 } 62 if (vec[i][0].type == OPIHI_STR) { 63 gprint (GP_LOG, "%s ", vec[i][0].elements.Str[j]); 64 } 61 65 } 62 66 } -
trunk/Ohana/src/opihi/cmd.data/read_vectors.c
r40519 r41269 35 35 36 36 // vector types 37 enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_CHAR };37 enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_CHAR, COLTYPE_STR}; 38 38 39 39 static int Nvec = 0; … … 91 91 gprint (GP_ERR, " -skip N : skip N lines before reading\n"); 92 92 gprint (GP_ERR, " column names may include a type: name:type\n"); 93 gprint (GP_ERR, " type is int, float, char, time\n");93 gprint (GP_ERR, " type is int, float, char, str, time\n"); 94 94 gprint (GP_ERR, " for char, values are placed into a list $name:0 - $name:n\n"); 95 gprint (GP_ERR, " for str, values are placed into a string-typed vector\n"); 95 96 gprint (GP_ERR, " for time, values are human-readable date/time strings YYYY/MM/DD,hh:mm:ss\n"); 96 97 gprint (GP_ERR, " the resulting vector is a float based on the TIMEFORMAT, TIMEREF values\n"); … … 152 153 if (!strcasecmp(ptr, "int")) { coltype[i] = COLTYPE_INT; } 153 154 if (!strcasecmp(ptr, "char")) { coltype[i] = COLTYPE_CHAR; } 155 if (!strcasecmp(ptr, "str")) { coltype[i] = COLTYPE_STR; } 154 156 if (!strcasecmp(ptr, "time")) { coltype[i] = COLTYPE_TIME; } 155 157 if (!coltype[i]) goto bad_colname; … … 213 215 // note that COLTYPE_TIME is a type of float 214 216 ResetVector (vec[i], OPIHI_FLT, NELEM); 217 break; 218 case COLTYPE_STR: 219 ResetVector (vec[i], OPIHI_STR, NELEM); 215 220 break; 216 221 case COLTYPE_CHAR: … … 311 316 break; 312 317 } 318 case COLTYPE_STR: 319 { 320 // I need to get an isolated word in 'value' with the string value of this field 321 char *ptr = IsCSV ? ptrparse_csv (col[i], c0) : ptrparse (col[i], c0); 322 char *value = NULL; 323 if (IsCSV) { 324 char *end = parse_nextword_csv (ptr); 325 if (end) { 326 value = end ? strncreate (ptr, end - ptr) : strcreate (ptr); 327 } 328 } else { 329 value = thisword(ptr); 330 } 331 vec[i][0].elements.Str[Nelem] = value; // needs to be freed later. 332 break; 333 } 313 334 case COLTYPE_FLT: 314 335 readStatus = IsCSV ? dparse_csv (&dvalue, col[i], c0) : dparse (&dvalue, col[i], c0); … … 348 369 ResetVector (vec[i], OPIHI_FLT, NELEM); 349 370 break; 371 case COLTYPE_STR: 372 ResetVector (vec[i], OPIHI_STR, NELEM); 373 break; 350 374 case COLTYPE_CHAR: 351 375 default: … … 369 393 ResetVector (vec[i], OPIHI_FLT, Nelem); 370 394 break; 395 case COLTYPE_STR: 396 ResetVector (vec[i], OPIHI_STR, Nelem); 397 break; 371 398 case COLTYPE_CHAR: 372 399 sprintf (varname, "%s:n", listname[i]); … … 469 496 } 470 497 471 // if CharAsVectors, char fields will be saved as vectors NAME:0 -- NAME:n for n characters 472 // else char fields will be saved as $NAME:0 - $NAME:m for m rows 498 // by default, we now store a string-type field as a string-type vector. 499 500 // if CharAsList is selected (and My < 10000), char fields will be saved as $NAME:0 - $NAME:m for m rows 501 502 // if CharAsVectors is selected, char fields will be saved as vectors NAME:0 -- NAME:n for n characters 503 473 504 // if (Ny > 10000), force CharAsVectors 474 505 int CharAsVectors = FALSE; … … 476 507 remove_argument (N, &argc, argv); 477 508 CharAsVectors = TRUE; 509 } 510 int CharAsList = FALSE; 511 if ((N = get_argument (argc, argv, "-char-list"))) { 512 remove_argument (N, &argc, argv); 513 CharAsList = TRUE; 478 514 } 479 515 … … 651 687 if (!FITS_TRANSPOSE) { 652 688 // read string column into a list rather than a vector 653 if (!strcmp (type, "char") && !CharAsVectors && (Ny < 3000)) { 654 char *fieldName = argv[i]; 655 char *Ptr = data; 656 char varname[1024]; // used as a buffer for the names of string fields 657 for (j = 0; j < Ny; j++) { 658 set_list_varname (varname, fieldName, j, FALSE); 659 char *value = strncreate (&Ptr[j*Nval], Nval); 660 // replace instances of $ with _ 661 char *p = strchr (value, '$'); 662 while (p) { 663 *p = '_'; 664 p = strchr (p, '$'); 689 if (!strcmp (type, "char")) { 690 // save char-type field as a List: 691 if (CharAsList && (Ny < 3000)) { 692 char *fieldName = argv[i]; 693 char *Ptr = data; 694 char varname[1024]; // used as a buffer for the names of string fields 695 for (j = 0; j < Ny; j++) { 696 set_list_varname (varname, fieldName, j, FALSE); 697 char *value = strncreate (&Ptr[j*Nval], Nval); 698 // replace instances of $ with _ 699 char *p = strchr (value, '$'); 700 while (p) { 701 *p = '_'; 702 p = strchr (p, '$'); 703 } 704 set_str_variable (varname, value); 705 free (value); 665 706 } 666 set_str_variable (varname, value); 667 free (value); 707 sprintf (varname, "%s:n", fieldName); 708 set_int_variable (varname, Ny); 709 continue; 668 710 } 669 sprintf (varname, "%s:n", fieldName); 670 set_int_variable (varname, Ny); 671 continue; 711 // save char-type field as a string-type vector: 712 if (!CharAsVectors) { 713 Vector *myVector = NULL; 714 sprintf (name, "%s", argv[i]); 715 if ((myVector = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name\n"); 716 ResetVector (myVector, OPIHI_STR, Ny); 717 718 char *Ptr = data; 719 for (j = 0; j < Ny; j++) { 720 myVector[0].elements.Str[j] = strncreate (&Ptr[j*Nval], Nval); 721 // replace instances of $ with _ 722 char *p = strchr (myVector[0].elements.Str[j], '$'); 723 while (p) { *p = '_'; p = strchr (p, '$'); } 724 } 725 continue; 726 } 672 727 } 673 728 674 729 // define the multifield vector names (Nval vectors x Ny elements) 730 // CharAsVectors is handled below automatically 675 731 ALLOCATE (vec, Vector *, Nval); 676 732 for (j = 0; j < Nval; j++) { -
trunk/Ohana/src/opihi/cmd.data/rotate.c
r41164 r41269 268 268 269 269 out_buff = (float *)buf[0].matrix.buffer; 270 270 271 for (j = 0; j < Ly; j++) { 271 272 for (i = 0; i < Lx; i++, out_buff++) { -
trunk/Ohana/src/opihi/cmd.data/tvcolors.c
r40626 r41269 37 37 gprint (GP_ERR, "USAGE: tvcolors (colormap) [-nan red green blue]\n"); 38 38 gprint (GP_ERR, " colormap options : greyscale, -greyscale, rainbow, heat, fullcolor, ruffcolor (also grayscale, -grayscale)\n"); 39 gprint (GP_ERR, " colormap file name of the for WORD:PATH where WORD = (file,csvf,lgcy,cetf)\n"); 40 gprint (GP_ERR, " lgcy:\n"); 41 gprint (GP_ERR, " the colormap file must contain 4 columns: f R B G; each line defines a color transition.\n"); 42 gprint (GP_ERR, " f: 0 - 1 defines the scale value for the transition\n"); 43 gprint (GP_ERR, " R,B,G: 0 - 1 define the value of the color at the transition point\n"); 44 gprint (GP_ERR, " file:\n"); 39 gprint (GP_ERR, " colormap file: if colormap name is given as file:path/to/file, the colormap is read from the file\n"); 45 40 gprint (GP_ERR, " the colormap file must contain 4 columns: f R G B; each line defines a color transition.\n"); 46 41 gprint (GP_ERR, " f: 0 - 1 defines the scale value for the transition\n"); 47 42 gprint (GP_ERR, " R,G,B: 0 - 1 define the value of the color at the transition point\n"); 48 gprint (GP_ERR, " csvf:\n");49 gprint (GP_ERR, " the colormap file must contain 4 columns: f,R,G,B separate by commas; each line defines a color transition.\n");50 gprint (GP_ERR, " f: 0 - 1 defines the scale value for the transition\n");51 gprint (GP_ERR, " R,G,B: 0 - 1 define the value of the color at the transition point\n");52 gprint (GP_ERR, " cetf:\n");53 gprint (GP_ERR, " the colormap file must 256 rows contain 3 columns: R,G,B separate by commas; each line defines a color transition.\n");54 gprint (GP_ERR, " R,G,B: 0 - 1 define the value of the color at the transition point\n");55 gprint (GP_ERR, " CETF-format files can be found at : https://peterkovesi.com/projects/colourmaps\n");56 43 return (FALSE); 57 44 } -
trunk/Ohana/src/opihi/cmd.data/write_vectors.c
r41164 r41269 154 154 if (ADD_HEADER) { 155 155 for (j = 0; j < Nvec; j++) { 156 if (j == 0) fprintf (f, "# "); 156 157 if (CSV) { 157 158 fprintf (f, "%s,", vec[j][0].name); 158 159 } else { 159 if (j == 0) fprintf (f, "# ");160 160 fprintf (f, "%s ", vec[j][0].name); 161 161 } … … 166 166 /* default output format */ 167 167 if (format == (char *) NULL) { 168 char padChar = CSV ? ',' : ' '; 168 169 for (i = 0; i < vec[0][0].Nelements; i++) { 169 170 for (j = 0; j < Nvec; j++) { 170 if (vec[j][0].type == OPIHI_FLT) { 171 if (CSV) { 172 fprintf (f, "%.12g,", vec[j][0].elements.Flt[i]); 173 } else { 174 fprintf (f, "%.12g ", vec[j][0].elements.Flt[i]); 175 } 176 } else { 177 if (CSV) { 178 fprintf (f, OPIHI_INT_FMT",", vec[j][0].elements.Int[i]); 179 } else { 180 fprintf (f, OPIHI_INT_FMT" ", vec[j][0].elements.Int[i]); 181 } 171 switch (vec[j][0].type) { 172 case OPIHI_FLT: 173 fprintf (f, "%.12g%c", vec[j][0].elements.Flt[i], padChar); 174 break; 175 case OPIHI_INT: 176 fprintf (f, OPIHI_INT_FMT"%c", vec[j][0].elements.Int[i], padChar); 177 break; 178 case OPIHI_STR: 179 fprintf (f, "%s%c", vec[j][0].elements.Str[i], padChar); 180 break; 182 181 } 183 182 } … … 226 225 fmttype[j] = 'd'; 227 226 break; 227 case 's': 228 fmttype[j] = 's'; 229 break; 228 230 default: 229 gprint (GP_ERR, "syntax error in format (only e,f,d,c,x allowed)\n");231 gprint (GP_ERR, "syntax error in format (only e,f,d,c,x,s allowed)\n"); 230 232 return (FALSE); 231 233 } … … 234 236 strcat (fmtlist[Nvec-1], p0); 235 237 238 // check format types against vector types: 239 for (j = 0; j < Nvec; j++) { 240 switch (vec[j][0].type) { 241 case OPIHI_FLT: 242 case OPIHI_INT: 243 if (fmttype[j] == 's') { 244 gprint (GP_ERR, "mismatch between string format and numerical vector for %s\n", vec[j][0].name); 245 return FALSE; 246 } 247 break; 248 case OPIHI_STR: 249 if (fmttype[j] != 's') { 250 gprint (GP_ERR, "mismatch between numerical format and string vector for %s\n", vec[j][0].name); 251 return FALSE; 252 } 253 break; 254 } 255 } 256 236 257 for (i = 0; i < vec[0][0].Nelements; i++) { 237 258 for (j = 0; j < Nvec; j++) { … … 249 270 fprintf (f, fmtlist[j], (opihi_flt)(vec[j][0].elements.Int[i])); 250 271 } 272 } 273 if (fmttype[j] == 's') { 274 fprintf (f, fmtlist[j], vec[j][0].elements.Str[i]); 251 275 } 252 276 } -
trunk/Ohana/src/opihi/include/dvomath.h
r41165 r41269 6 6 # define OPIHI_NAME_SIZE 1024 7 7 8 /* OPIHI_FLT, OPIHI_INT and related are defined in libdvo/include/dvodb.h */ 9 8 10 # define NCHARS 256 9 // # define opihi_flt double10 // # define opihi_int int11 // NOTE: if opihi_int is changed to unsigned, all subtraction and negation operations12 // need to result in a float value (or 3 - 5 will yield the unexpected value 2^32 - 2)13 11 14 12 # define REQUIRE_VECTOR_FLT(VECT,RVAL) { \ … … 26 24 enum {ANYVECTOR, NEWVECTOR, OLDVECTOR}; 27 25 enum {ANYBUFFER, NEWBUFFER, OLDBUFFER}; 28 #ifdef NOT_MOVED_TO_LIBDVO29 enum {OPIHI_FLT, OPIHI_INT};30 #endif31 26 32 27 typedef struct { /* representation of a variable (0-D) */ … … 40 35 union { 41 36 void *Ptr; 37 char **Str; 42 38 opihi_flt *Flt; 43 39 opihi_int *Int; -
trunk/Ohana/src/opihi/lib.shell/VectorIO.c
r41176 r41269 2 2 void gfits_compress_timing (); 3 3 4 static int VectorGetMaxStringLength (Vector *vec) { 5 6 int MaxLength = 0; 7 8 if (vec[0].type != OPIHI_STR) return 0; 9 10 for (int i = 0; i < vec[0].Nelements; i++) { 11 MaxLength = MAX (MaxLength, strlen(vec[0].elements.Str[i])); 12 } 13 return MaxLength; 14 } 15 4 16 // write a set of vectors to a FITS FTable structure (vectors names become fits column names) 5 17 static int WriteVectorTable (FTable *ftable, char *extname, Vector **vec, int Nvec, char *format, char nativeOrder) { … … 44 56 } 45 57 ptr = endptr; // this should now point at the letter that is the format type 46 if ((*ptr != 'B') && (*ptr != 'I') && (*ptr != 'J') && (*ptr != 'K') && (*ptr != 'D') && (*ptr != 'E') ) {58 if ((*ptr != 'B') && (*ptr != 'I') && (*ptr != 'J') && (*ptr != 'K') && (*ptr != 'D') && (*ptr != 'E') && (*ptr != 'A')) { 47 59 gprint (GP_ERR, "error in binary table format %s: invalid character %c\n", format, *ptr); 48 60 goto escape; … … 57 69 // tformat[2*j + 1] = 0; // a bit sleazy : use a 2xN string to store N 1-byte strings 58 70 59 j += Nelement[Nfield]; // advance past 71 // For numeric multi-valued fields, the number of elements from the format defines the number of 72 // vectors which go into that field. For string-type vectors, the format specifies the maximum number of characters 73 // that go into the field. 74 75 // for example, a format code of 3E should match a list of three numeric-type vectors while a format code of 15A should 76 // match a single string-type vector which will supply up to 15 chars per row. 77 78 if (*ptr != 'A') { 79 j += Nelement[Nfield]; // advance past Nelement vectors 80 } else { 81 if (vec[j][0].type != OPIHI_STR) { 82 gprint (GP_ERR, "error in binary table format %s (mismatch between string format and numeric vector %s)\n", format, vec[j][0].name); 83 goto escape; 84 } 85 j ++; // advance past a single string-type vector (validate that?) 86 } 60 87 if (j > Nvec) { 61 88 gprint (GP_ERR, "error in binary table format %s (too few vectors for listed field)\n", format); … … 73 100 } else { 74 101 for (j = 0; j < Nvec; j++) { 75 // if the format is not defined, just use the native byte-widths 76 ALLOCATE (tformat[j], char, 2); 77 tformat[j][0] = (vec[j][0].type == OPIHI_FLT) ? 'D' : 'K'; // this depends on opihi_int == int64_t for Int 78 tformat[j][1] = 0; 79 Nelement[j] = 1; 102 switch (vec[j][0].type) { 103 case OPIHI_FLT: 104 case OPIHI_INT: 105 // if the format is not defined, just use the native byte-widths 106 ALLOCATE (tformat[j], char, 2); 107 tformat[j][0] = (vec[j][0].type == OPIHI_FLT) ? 'D' : 'K'; 108 tformat[j][1] = 0; 109 Nelement[j] = 1; 110 break; 111 case OPIHI_STR: 112 // we need to examine the vector to determine the length 113 Nelement[j] = VectorGetMaxStringLength(vec[j]); 114 int Nchar = snprintf (tformat[j], 0, "%d%c", Nelement[j], 'A'); 115 ALLOCATE (tformat[j], char, Nchar + 1); 116 int Nout = snprintf (tformat[j], Nchar + 1, "%d%c", Nelement[j], 'A'); 117 myAssert (Nout <= Nchar, "oops"); 118 break; 119 } 80 120 } 81 121 Nfield = Nvec; … … 90 130 // this call supported multiple columns per named field 91 131 gfits_define_bintable_column (theader, tformat[j], vec[ivec][0].name, NULL, NULL, 1.0, 0.0); 92 ivec += Nelement[j]; 132 if (vec[ivec][0].type == OPIHI_STR) { 133 ivec ++; 134 } else { 135 ivec += Nelement[j]; 136 } 93 137 } 94 138 … … 109 153 // the first vector provides the name for the field 110 154 char *fieldname = vec[ivec][0].name; 111 for (int k = 0; k < Nelement[j]; k++, ivec++) { 155 156 if (vec[ivec][0].type == OPIHI_STR) { 157 // string-type vectors need to be copied into a contiguous buffer with the right dimensions: 112 158 Vector *thisvec = vec[ivec]; 113 if (thisvec->type == OPIHI_FLT) { 114 gfits_set_bintable_column_reformat (theader, ftable, fieldname, "double", thisvec->elements.Flt, thisvec->Nelements, k, nativeOrder); 115 } else { 116 gfits_set_bintable_column_reformat (theader, ftable, fieldname, "int64_t", thisvec->elements.Int, thisvec->Nelements, k, nativeOrder); 159 160 ALLOCATE_PTR (strbuffer, char, Nelement[j]*thisvec->Nelements); 161 for (int i = 0; i < thisvec->Nelements; i++) { 162 int nChar = MIN (strlen (thisvec->elements.Str[i]), Nelement[j]); 163 // fprintf (stderr, "%d %d %d : %d : %d : %s\n", ivec, j, i, Nelement[j], nChar, thisvec->elements.Str[i]); 164 memcpy (&strbuffer[i*Nelement[j]], thisvec->elements.Str[i], nChar); 165 } 166 gfits_set_bintable_column (theader, ftable, fieldname, strbuffer, thisvec->Nelements); 167 free (strbuffer); 168 ivec ++; 169 } else { 170 for (int k = 0; k < Nelement[j]; k++, ivec++) { 171 Vector *thisvec = vec[ivec]; 172 switch (thisvec->type) { 173 case OPIHI_FLT: 174 gfits_set_bintable_column_reformat (theader, ftable, fieldname, "double", thisvec->elements.Flt, thisvec->Nelements, k, nativeOrder); 175 break; 176 case OPIHI_INT: 177 gfits_set_bintable_column_reformat (theader, ftable, fieldname, "int64_t", thisvec->elements.Int, thisvec->Nelements, k, nativeOrder); 178 break; 179 } 117 180 } 118 181 } -
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.
