Changeset 15191 for trunk/psLib/src/fits/psFitsHeader.c
- Timestamp:
- Oct 3, 2007, 3:16:33 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFitsHeader.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsHeader.c
r15179 r15191 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.3 5$ $Name: not supported by cvs2svn $10 * @date $Date: 2007-10-0 3 21:27:21$9 * @version $Revision: 1.36 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2007-10-04 01:16:33 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 54 54 NULL }; 55 55 56 // How to translate between keywords 57 typedef struct { 58 const char *from; // Translate from this keyword 59 const char *to; // Translate to this keyword 60 } keywordTranslation; 61 62 // Translation for compressed image headers FROM TO 63 static keywordTranslation compressTranslation[] = { { "ZSIMPLE", "SIMPLE" }, 64 { "ZTENSION", "XTENSION" }, 65 { "ZBITPIX", "BITPIX" }, 66 { "ZNAXIS", "NAXIS" }, 67 { "ZNAXIS1", "NAXIS1" }, 68 { "ZNAXIS2", "NAXIS2" }, 69 { "ZNAXIS3", "NAXIS3" }, 70 { "ZEXTEND", "EXTEND" }, 71 { "ZBLOCKED", "BLOCKED"}, 72 { "ZPCOUNT", "PCOUNT" }, 73 { "ZGCOUNT", "GCOUNT" }, 74 { "ZHECKSUM", "CHECKSUM"}, 75 { "ZDATASUM", "DATASUM" }, 76 { NULL, NULL } }; 77 78 56 79 // Compare a keyword with a list of keywords; return true if it's in the list 57 80 static bool keywordInList(const char *keyword, // Keyword to check 58 const char * *list// List of keywords81 const char *list[] // List of keywords 59 82 ) 60 83 { … … 65 88 } 66 89 return false; 90 } 91 92 static const char *keywordTranslate(const char *keyword, // Keyword to check 93 keywordTranslation translation[] // Translation list 94 ) 95 { 96 for (keywordTranslation *trans = translation; (*trans).from; ++trans) { 97 if (strcmp(keyword, (*trans).from) == 0) { 98 // Translate it 99 return (*trans).to; 100 } else if (strcmp(keyword, (*trans).to) == 0) { 101 // Ignore it completely --- something else will translate to it 102 return NULL; 103 } 104 } 105 // It translates to itself 106 return keyword; 67 107 } 68 108 … … 179 219 fits_get_hdrpos(fits->fd, &numKeys, &keyNum, &status); 180 220 221 bool compressed = false; // Is this a compressed image? 222 if (fits->conventions.compression && fits_is_compressed_image(fits->fd, &status)) { 223 compressed = true; 224 } 225 181 226 // Get each key name. Keywords start at one. 182 227 for (int i = 1; i <= numKeys; i++) { … … 192 237 } 193 238 239 const char *keyNameTrans = keyName; // Translated name of keyword 240 if (compressed) { 241 keyNameTrans = keywordTranslate(keyName, compressTranslation); 242 if (!keyNameTrans) { 243 // It's to be ignored (it will be replaced by something else) 244 continue; 245 } 246 } 247 194 248 // Check to see if the keyword should be duplicated 195 249 int dupFlag = 0; // Duplicate flag … … 212 266 case 'X': // bit 213 267 case 'B': // byte 214 success = psMetadataAddS8(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue)); 268 success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 269 atoi(keyValue)); 215 270 break; 216 271 case 'I': // short int. … … 218 273 // Trap NAN, INF and -INF, which cfitsio doesn't handle. 219 274 if (strncasecmp(keyValue, "NAN", 3) == 0) { 220 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName , dupFlag, keyComment, NAN);275 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN); 221 276 } else if (strncasecmp(keyValue, "INF", 3) == 0) { 222 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY); 277 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 278 INFINITY); 223 279 } else if (strncasecmp(keyValue, "-INF", 4) == 0) { 224 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY); 280 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 281 -INFINITY); 225 282 } else { 226 success = psMetadataAddS32(header, PS_LIST_TAIL, keyName , dupFlag, keyComment,283 success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 227 284 atoi(keyValue)); 228 285 } 229 286 break; 230 287 case 'J': // int. 231 success = psMetadataAddS32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue)); 288 success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 289 atoi(keyValue)); 232 290 break; 233 291 case 'U': // unsigned int. 234 success = psMetadataAddU32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atol(keyValue)); 292 success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 293 atol(keyValue)); 235 294 break; 236 295 237 296 case 'K': // long int. can't all fit in a psS32, put in psF64 238 297 case 'F': 239 success = psMetadataAddF64(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atof(keyValue)); 298 success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 299 atof(keyValue)); 240 300 break; 241 301 case 'C': { … … 245 305 // cfitsio won't write these, so we write them as strings, and then have to trap them on read. 246 306 if (strcasecmp(keyValueFixed, "NAN") == 0) { 247 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName , dupFlag, keyComment, NAN);307 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN); 248 308 } else if (strcasecmp(keyValueFixed, "INF") == 0) { 249 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY); 309 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 310 INFINITY); 250 311 } else if (strcasecmp(keyValueFixed, "-INF") == 0) { 251 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY); 252 } else if (!fits->conventions.compression || 253 (strcmp(keyName, "EXTNAME") != 0 || strcmp(keyValueFixed, "COMPRESSED_IMAGE") != 0)) { 312 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 313 -INFINITY); 314 } else if (compressed && strcmp(keyName, "EXTNAME") == 0 && 315 strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) { 254 316 // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected 255 success = psMetadataAddStr(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, 317 success = true; 318 } else { 319 success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 256 320 keyValueFixed); 257 321 } … … 260 324 case 'L': { 261 325 bool temp = (keyValue[0] == 'T') ? 1 : 0; 262 success = psMetadataAddBool(header, PS_LIST_TAIL, keyName , dupFlag, keyComment, temp);326 success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp); 263 327 break; 264 328 } … … 270 334 271 335 if (!success) { 272 psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s."), keyName); 336 psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s --> %s."), 337 keyName, keyNameTrans); 273 338 psFree(header); 274 339 return NULL; … … 278 343 279 344 if (status != 0) { 280 char fitsErr[MAX_STRING_LENGTH]; 281 (void)fits_get_errstatus(status, fitsErr); 282 psError(PS_ERR_IO, true, _("Failed to add metadata item, %s."), fitsErr); 345 psFitsError(status, true, _("Failed to add metadata item.")); 283 346 psFree(header); 284 347 return false;
Note:
See TracChangeset
for help on using the changeset viewer.
