IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 6, 2007, 5:09:52 PM (19 years ago)
Author:
eugene
Message:

merging changes from eam_branch_20071015 (read compressed images, clean addstar I/O, other minor issues)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/read_vectors.c

    r7917 r15487  
    150150int read_table_vectors (int argc, char **argv, char *extname) {
    151151
    152   int i, j, k, Nbytes, Nread, Nextend, Ny, Binary;
    153   char type[16];
     152  int i, j, k, N, Nbytes, Nread, Nextend, Ny, Binary;
     153  char type[16], ID[80], *CCDKeyword;
    154154  FTable table;
    155155  Header header;
    156156  Vector **vec;
    157157
     158  table.buffer = NULL;
     159  header.buffer = NULL;
     160
     161  CCDKeyword = NULL;
     162  if ((N = get_argument (argc, argv, "-keyword"))) {
     163    remove_argument (N, &argc, argv);
     164    CCDKeyword = strcreate (argv[N]);
     165    remove_argument (N, &argc, argv);
     166  }
     167
     168  Nextend = -1;
     169  if ((N = get_argument (argc, argv, "-extnum"))) {
     170    remove_argument (N, &argc, argv);
     171    Nextend = atoi (extname);
     172  }
     173
    158174  if (argc < 2) {
    159     gprint (GP_ERR, "USAGE: read -fits extension name name ...\n");
     175    gprint (GP_ERR, "USAGE: read -fits extension [-extnum] [-keyword key] name name ...\n");
    160176    gprint (GP_ERR, "  ('extension' may be a name or number)\n");
    161     return (FALSE);
    162   }
    163 
    164   if (f == (FILE *) NULL) return (FALSE);
     177    goto escape;
     178  }
     179
     180  if (f == (FILE *) NULL) goto escape;
    165181  fseek (f, 0, SEEK_SET);
    166182  table.header = &header;
    167183
    168184  /* load appropriate extension (if extname is a number, use count) */
    169   if (isdigit(extname[0])) {
    170     Nextend = atoi (extname);
    171 
    172     for (i = 0; i <= Nextend; i++) {
    173       if (!gfits_load_header (f, &header)) return (FALSE);
    174       Nbytes = gfits_matrix_size (&header);
     185  if (Nextend > -1) {
     186    // first extension is PHU, cannot be a table.
     187    // Nextend counts from 0 for first extension
     188    if (!gfits_load_header (f, &header)) goto escape;
     189    Nbytes = gfits_data_size (&header);
     190    fseek (f, Nbytes, SEEK_CUR);
     191    gfits_free_header (&header);
     192
     193    for (i = 0; i < Nextend; i++) {
     194      if (!gfits_load_header (f, &header)) goto escape;
     195      Nbytes = gfits_data_size (&header);
    175196      /* skip the prior data buffers */
    176       if (i < Nextend) {
     197      fseek (f, Nbytes, SEEK_CUR);
     198      gfits_free_header (&header);
     199    }
     200    if (!gfits_load_header (f, &header)) goto escape;
     201    if (!gfits_fread_ftable_data (f, &table)) goto escape;
     202
     203  } else {
     204    if (CCDKeyword == NULL) {
     205      CCDKeyword = get_variable ("CCDKEYWORD");
     206    }
     207    if (CCDKeyword == NULL) {
     208      CCDKeyword = strcreate ("EXTNAME");
     209    }
     210
     211    while (1) {
     212      if (!gfits_load_header (f, &header)) goto escape;
     213      Nbytes = gfits_data_size (&header);
     214
     215      if (!gfits_scan (&header, CCDKeyword, "%s", 1, ID)) {
    177216        fseek (f, Nbytes, SEEK_CUR);
    178217        gfits_free_header (&header);
    179218        continue;
    180219      }
    181       /* on the desired header, load buffer */
    182       ALLOCATE (table.buffer, char, Nbytes);
    183       Nread = fread (table.buffer, sizeof (char), Nbytes, f);
    184       if (Nread != Nbytes) {
    185         gfits_free_table  (&table);
     220      if (strcmp (ID, extname)) {
     221        fseek (f, Nbytes, SEEK_CUR);
    186222        gfits_free_header (&header);
    187         return (FALSE);
    188       }
    189       table.size = Nbytes;
    190     }
    191   } else {
    192     if (!gfits_fread_ftable (f, &table, extname)) return (FALSE);
     223        continue;
     224      }
     225      if (!gfits_fread_ftable_data (f, &table)) goto escape;
     226      break;
     227    }
    193228  }
    194229
     
    196231  Binary = FALSE;
    197232  gfits_scan (&header, "XTENSION", "%s", 1, type);
    198   if (!strcmp (type, "BINTABLE")) {
    199     Binary = TRUE;
    200   }
     233  if (strcmp (type, "BINTABLE") && strcmp (type, "TABLE")) {
     234    gprint (GP_ERR, "specified extension (%s) is not a table\n", extname);
     235    goto escape;
     236  }
     237  Binary = !strcmp (type, "BINTABLE");
    201238  Ny = header.Naxis[1];
    202239
     
    214251    Nval = 0;
    215252    if (Binary) {
    216       if (!gfits_get_bintable_column_type (&header, argv[i], type, &Nval)) return (FALSE);
    217       if (!gfits_get_bintable_column (&header, &table, argv[i], &data)) return (FALSE);
     253      if (!gfits_get_bintable_column_type (&header, argv[i], type, &Nval)) goto escape;
     254      if (!gfits_get_bintable_column (&header, &table, argv[i], &data)) goto escape;
    218255    } else {
    219       if (!gfits_get_table_column_type (&header, argv[i], type)) return (FALSE);
    220       if (!gfits_get_table_column (&header, &table, argv[i], &data)) return (FALSE);
    221     }
    222     if (Nval == 0) return (FALSE);
     256      if (!gfits_get_table_column_type (&header, argv[i], type)) goto escape;
     257      if (!gfits_get_table_column (&header, &table, argv[i], &data)) goto escape;
     258    }
     259    if (Nval == 0) goto escape;
    223260
    224261    ALLOCATE (vec, Vector *, Nval);
     
    228265      else
    229266        sprintf (name, "%s:%d", argv[i], j);
    230       if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) return (FALSE);   
     267      if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) goto escape;
    231268      REALLOCATE (vec[j][0].elements, float, MAX (Ny,1));
    232269      vec[j][0].Nelements = Ny;
     
    276313    free (vec);
    277314  }
     315  if (CCDKeyword != NULL) free (CCDKeyword);
    278316  gfits_free_table (&table);
    279317  gfits_free_header (&header);
    280318  return (TRUE);
     319
     320escape:
     321  if (CCDKeyword != NULL) free (CCDKeyword);
     322  gfits_free_table  (&table);
     323  gfits_free_header (&header);
     324  return (FALSE);
    281325}
Note: See TracChangeset for help on using the changeset viewer.