IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 28, 2015, 8:27:00 PM (11 years ago)
Author:
eugene
Message:

adding code for table compress/uncompress; image compress works (but is not quite compatible with cfitsio for some reason and byteswap is broken)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ohana.20150429/src/libfits/table/F_table_varlength.c

    r38326 r38329  
    1515  snprintf (field, 80, "TFORM%d", column);
    1616  if (!gfits_scan (ftable->header, field, "%s", 1, format)) return (FALSE);
     17
     18  def->column = column;
    1719
    1820  // find and remove the max field length element
     
    4951  if (*p1 == 'I') { def->nbytes = 2;  def->format = *p1; }
    5052  if (*p1 == 'J') { def->nbytes = 4;  def->format = *p1; }
     53  if (*p1 == 'K') { def->nbytes = 8;  def->format = *p1; }
    5154  if (*p1 == 'E') { def->nbytes = 4;  def->format = *p1; }
    5255  if (*p1 == 'D') { def->nbytes = 8;  def->format = *p1; }
     
    5558  if (!def->nbytes) { return (FALSE); }
    5659 
    57   /* scan columns to find column offset */
    58   def->Nstart = 0;
     60  /* scan columns to find column offset for metadata column*/
     61  def->offset = 0;
    5962  for (i = 1; i < column; i++) {
    6063    sprintf (field, "TFORM%d", i);
    6164    gfits_scan (ftable->header, field, "%s", 1, format);
    6265    gfits_bintable_format (format, tmpline, &Nv, &Nb);
    63     def->Nstart += Nv*Nb;
     66    def->offset += Nv*Nb;
    6467  }
    6568
    6669  // heap_start must be long long so file may be very large
    67   if (!gfits_scan (ftable->header, "THEAP", OFF_T_FMT, 1,  &def->heap_start)) {
    68     def->heap_start = ftable->header->Naxis[0]*ftable->header->Naxis[1];
    69   }
    70 
     70  // confirm that ftable->heap_start is correctly set?
     71
     72  return TRUE;
     73}
     74
     75# define SWAP_WORD \
     76  tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \
     77  tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp;
     78
     79# define SWAP_DBLE \
     80  tmp = pchar[0]; pchar[0] = pchar[7]; pchar[7] = tmp; \
     81  tmp = pchar[1]; pchar[1] = pchar[6]; pchar[6] = tmp; \
     82  tmp = pchar[2]; pchar[2] = pchar[5]; pchar[5] = tmp; \
     83  tmp = pchar[3]; pchar[3] = pchar[4]; pchar[4] = tmp;
     84
     85int gfits_byteswap_varlength_column (FTable *ftable, int column) {
     86
     87# ifdef BYTE_SWAP 
     88  VarLengthColumn zdef;
     89  if (!gfits_varlength_column_define (ftable, &zdef, column)) return FALSE;
     90
     91  char *bufstart = &ftable->buffer[zdef.offset];
     92
     93  int i;
     94  char *pchar, tmp;
     95
     96  off_t Nx = ftable->header->Naxis[0];
     97
     98  for (i = 0; i < ftable->header->Naxis[1]; i++) {
     99    if (zdef.mode == 'P') {
     100      pchar = &bufstart[i*Nx];
     101      SWAP_WORD;
     102      pchar = &bufstart[i*Nx + 4];
     103      SWAP_WORD;
     104    }     
     105    if (zdef.mode == 'Q') {
     106      char *pchar, tmp;
     107      pchar = &bufstart[i*Nx];
     108      SWAP_DBLE;
     109      pchar = &bufstart[i*Nx + 8];
     110      SWAP_DBLE;
     111    }
     112  }
     113# endif
    71114  return TRUE;
    72115}
     
    85128  Nx = ftable->header->Naxis[0];
    86129
    87 # define SWAP_WORD \
    88   tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \
    89   tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp;
    90 
    91130# ifdef BYTE_SWAP
    92131  char *pchar, tmp;
    93   pchar = &ftable->buffer[row*Nx + column->Nstart];
     132  pchar = &ftable->buffer[row*Nx + column->offset];
    94133  SWAP_WORD;
    95   pchar = &ftable->buffer[row*Nx + column->Nstart + 4];
     134  pchar = &ftable->buffer[row*Nx + column->offset + 4];
    96135  SWAP_WORD;
    97136# endif
     
    99138  if (column->mode == 'P') {
    100139    int *ptr;
    101     ptr = (int *) &ftable->buffer[row*Nx + column->Nstart];
     140    ptr = (int *) &ftable->buffer[row*Nx + column->offset];
    102141    *length = ptr[0];
    103142    offset = ptr[1];
     
    105144  if (column->mode == 'Q') {
    106145    off_t *ptr;
    107     ptr = (off_t *) &ftable->buffer[row*Nx + column->Nstart];
     146    ptr = (off_t *) &ftable->buffer[row*Nx + column->offset];
    108147    *length = ptr[0];
    109148    offset = ptr[1];
    110149  }
    111150
    112   result = (void *) (ftable->buffer + column->heap_start + offset);
     151  result = (void *) (ftable->buffer + ftable->heap_start + offset);
    113152  return result;
    114153}
     
    121160// swap before writing out
    122161
    123 // Here are operations we need to do:
    124 
    125162int gfits_varlength_column_add_data (FTable *table, char *data, off_t Ndata, int row, VarLengthColumn *column) {
    126163
    127164  // find the current starting point for new data (end of current buffer main data + current heap
    128165  off_t heap_offset = gfits_data_min_size (table->header);
    129   char *heap_ptr = ftable->buffer + heap_offset;
    130166
    131167  // extend the buffer size to add the new data
     
    133169  REALLOCATE (table->buffer, char, Nbytes);
    134170
     171  char *heap_ptr = table->buffer + heap_offset;
     172
    135173  // add the new data to the table buffer
    136174  memcpy (heap_ptr, data, Ndata);
     
    142180  // find the cell for the specified row & column
    143181  // the values in the main table for this row and varlength column:
    144   Nx = ftable->header->Naxis[0];
     182  int Nx = table->header->Naxis[0];
    145183
    146184  // set the cell values
    147185  if (column->mode == 'P') {
    148186    int *ptr;
    149     ptr = (int *) &ftable->buffer[row*Nx + column->Nstart];
     187    ptr = (int *) &table->buffer[row*Nx + column->offset];
    150188    ptr[0] = Ndata;
    151     ptr[1] = heap_offset;
     189    ptr[1] = heap_offset - table->heap_start;
    152190  }
    153191  if (column->mode == 'Q') {
    154192    off_t *ptr;
    155     ptr = (off_t *) &ftable->buffer[row*Nx + column->Nstart];
     193    ptr = (off_t *) &table->buffer[row*Nx + column->offset];
    156194    ptr[0] = Ndata;
    157     ptr[1] = heap_offset;
     195    ptr[1] = heap_offset - table->heap_start;
    158196  }
    159197
    160198  // update maxlen
     199  // fprintf (stderr, "row: %d, Ndata: %d, maxlen: %d\n", (int) row, (int) Ndata, (int) column->maxlen);
    161200  column->maxlen = MAX (column->maxlen, Ndata);
    162201
    163202  off_t pcount;
    164   gfits_scan (ftable->header, "PCOUNT", OFF_T_FMT, 1, &pcount);
     203  gfits_scan (table->header, "PCOUNT", OFF_T_FMT, 1, &pcount);
    165204
    166205  pcount += Ndata;
    167   gfits_modify (header, "PCOUNT", OFF_T_FMT, 1, pcount);
    168 
    169   return TRUE;
    170 }
     206  gfits_modify (table->header, "PCOUNT", OFF_T_FMT, 1, pcount);
     207  table->header->pcount = pcount;
     208  table->datasize = gfits_data_size (table->header);
     209
     210  return TRUE;
     211}
     212
     213// update the header TFORM value for this entry
     214int gfits_varlength_column_finish (FTable *ftable, VarLengthColumn *def) {
     215
     216  char field[81];
     217  char format[81];
     218
     219  // grab the value of TFORMn for this column
     220  snprintf (field, 80, "TFORM%d", def->column);
     221  if (!gfits_scan (ftable->header, field, "%s", 1, format)) return FALSE;
     222
     223  // find and update the max field length element
     224  char *p1 = strchr (format, '(');
     225  if (!p1) return (FALSE); // not a valid varlength column -- missing (e_max)
     226 
     227  p1 ++;
     228  *p1 = 0;
     229
     230  snprintf (p1, 80 - (p1 - format), "%d)", def->maxlen);
     231  if (!gfits_modify (ftable->header, field, "%s", 1, format)) return FALSE;
     232
     233  return TRUE;
     234}
Note: See TracChangeset for help on using the changeset viewer.