IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 17, 2008, 10:23:02 AM (17 years ago)
Author:
Paul Price
Message:

Adding support for read/write 64-bit integers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/fits/psFitsHeader.c

    r21027 r21028  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2008-12-17 20:00:30 $
     9 *  @version $Revision: 1.51 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2008-12-17 20:23:02 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    341341                break;
    342342
    343               case 'K': // long int. can't all fit in a psS32, put in psF64
    344               case 'F':
     343              case 'K': // long long (64-bit) integer
     344                success = psMetadataAddS64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     345                                           atoll(keyValue));
     346                break;
     347              case 'F': // float/double
    345348                success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    346349                                           atof(keyValue));
     
    370373                  break;
    371374              }
    372               case 'L': {
     375              case 'L': {               // Logical (boolean)
    373376                  bool temp = (keyValue[0] == 'T') ? 1 : 0;
    374377                  success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
     
    589592            // A regular FITS header
    590593            switch (item->type) {
    591             case PS_DATA_BOOL: {
    592                     int value = item->data.B;
    593                     fits_update_key(fits->fd, TLOGICAL, name, &value, item->comment, &status);
     594              case PS_DATA_BOOL: {
     595                  int value = item->data.B;
     596                  fits_update_key(fits->fd, TLOGICAL, name, &value, item->comment, &status);
     597                  break;
     598              }
     599              case PS_DATA_S8:
     600                fits_update_key(fits->fd, TBYTE, name, &item->data.S8, item->comment, &status);
     601                break;
     602              case PS_DATA_S16:
     603                fits_update_key(fits->fd, TSHORT, name, &item->data.S16, item->comment, &status);
     604                break;
     605              case PS_DATA_S32:
     606                fits_update_key(fits->fd, TINT, name, &item->data.S32, item->comment, &status);
     607                break;
     608              case PS_DATA_S64:
     609                fits_update_key(fits->fd, TLONGLONG, name, &item->data.S64, item->comment, &status);
     610                break;
     611              case PS_DATA_U8: {
     612                  unsigned short int temp = item->data.U8;
     613                  fits_update_key(fits->fd, TUSHORT, name, &temp, item->comment, &status);
     614                  break;
     615              }
     616              case PS_DATA_U16:
     617                fits_update_key(fits->fd, TUSHORT, name, &item->data.U16, item->comment, &status);
     618                break;
     619              case PS_DATA_U32:
     620                fits_update_key(fits->fd, TUINT, name, &item->data.U32, item->comment, &status);
     621                break;
     622              case PS_DATA_U64:
     623                // CFITSIO doesn't support unsigned 64-bit integers; attempt to write as signed
     624                if (item->data.U64 > PS_MAX_S64) {
     625                    psWarning("Unable to write 64-bit unsigned integer for item %s to header: "
     626                              "value %" PRIu64 " out of range", name, item->data.U64);
    594627                    break;
    595628                }
    596             case PS_DATA_S8:
    597                 fits_update_key(fits->fd, TBYTE, name, &item->data.S8, item->comment, &status);
    598                 break;
    599             case PS_DATA_S16:
    600                 fits_update_key(fits->fd, TSHORT, name, &item->data.S16, item->comment, &status);
    601                 break;
    602             case PS_DATA_S32:
    603                 fits_update_key(fits->fd, TINT, name, &item->data.S32, item->comment, &status);
    604                 break;
    605             case PS_DATA_U8: {
    606                     unsigned short int temp = item->data.U8;
    607                     fits_update_key(fits->fd, TUSHORT, name, &temp, item->comment, &status);
    608                 }
    609                 break;
    610             case PS_DATA_U16:
    611                 fits_update_key(fits->fd, TUSHORT, name, &item->data.U16, item->comment, &status);
    612                 break;
    613             case PS_DATA_U32:
    614                 fits_update_key(fits->fd, TUINT, name, &item->data.U32, item->comment, &status);
    615                 break;
    616             case PS_DATA_F32: {
    617                     int infCheck = 0;         // Result of isinf()
    618                     if (isnan(item->data.F32)) {
    619                         fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
    620                     } else if ((infCheck = isinf(item->data.F32)) != 0) {
    621                         if (infCheck == 1) {
    622                             fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
    623                         } else {
    624                             fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
    625                         }
    626                     } else {
    627                         fits_update_key(fits->fd, TFLOAT, name, &item->data.F32, item->comment,
    628                                         &status);
    629                     }
    630                     break;
    631                 }
    632             case PS_DATA_F64: {
    633                     int infCheck = 0;         // Result of isinf()
    634                     if (isnan(item->data.F64)) {
    635                         fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
    636                     } else if ((infCheck = isinf(item->data.F64)) != 0) {
    637                         if (infCheck == 1) {
    638                             fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
    639                         } else {
    640                             fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
    641                         }
    642                     } else {
    643                         fits_update_key(fits->fd, TDOUBLE, name, &item->data.F64, item->comment,
    644                                         &status);
    645                     }
    646                     break;
    647                 }
    648             case PS_DATA_STRING:
     629                psS64 temp = item->data.U64; // Signed version
     630                fits_update_key(fits->fd, TLONGLONG, name, &temp, item->comment, &status);
     631                break;
     632              case PS_DATA_F32: {
     633                  int infCheck = 0;         // Result of isinf()
     634                  if (isnan(item->data.F32)) {
     635                      fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
     636                  } else if ((infCheck = isinf(item->data.F32)) != 0) {
     637                      if (infCheck == 1) {
     638                          fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
     639                      } else {
     640                          fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
     641                      }
     642                  } else {
     643                      fits_update_key(fits->fd, TFLOAT, name, &item->data.F32, item->comment,
     644                                      &status);
     645                  }
     646                  break;
     647              }
     648              case PS_DATA_F64: {
     649                  int infCheck = 0;         // Result of isinf()
     650                  if (isnan(item->data.F64)) {
     651                      fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
     652                  } else if ((infCheck = isinf(item->data.F64)) != 0) {
     653                      if (infCheck == 1) {
     654                          fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
     655                      } else {
     656                          fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
     657                      }
     658                  } else {
     659                      fits_update_key(fits->fd, TDOUBLE, name, &item->data.F64, item->comment,
     660                                      &status);
     661                  }
     662                  break;
     663              }
     664              case PS_DATA_STRING:
    649665                fits_update_key(fits->fd, TSTRING, name, item->data.V, item->comment, &status);
    650666                break;
    651             default:  // all other META types are ignored
    652                 psWarning("Attempt to write metadata type %x to FITS header ignored.\n", item->type);
     667              default:  // all other META types are ignored
     668                psWarning("Attempt to write metadata %s of type %x to FITS header ignored.\n",
     669item->name, item->type);
    653670                break;
    654671            }
Note: See TracChangeset for help on using the changeset viewer.