Changeset 7222 for trunk/psLib/src/fits/psFits.c
- Timestamp:
- May 25, 2006, 1:53:07 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFits.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFits.c
r6767 r7222 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.5 3$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 4-04 19:52:42$9 * @version $Revision: 1.54 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2006-05-25 23:53:07 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 127 127 128 128 #if ( CFITSIO_DISKFILE == 1 ) 129 (void)fits_create_diskfile (130 #else131 (void)fits_create_file(132 #endif133 &fptr,134 name,135 &status);136 if (fptr == NULL || status != 0) {129 (void)fits_create_diskfile 130 #else 131 (void)fits_create_file 132 #endif 133 (&fptr, 134 name, 135 &status); 136 if (fptr == NULL || status != 0) { 137 137 char fitsErr[MAX_STRING_LENGTH] 138 ; 139 fits_get_errstatus(status, fitsErr); 140 psError(PS_ERR_IO, true, 141 PS_ERRORTEXT_psFits_FILENAME_CREATE_FAILED, 142 name, fitsErr); 143 return NULL; 144 } 145 } else { 146 #if ( CFITSIO_DISKFILE == 1 ) 147 (void)fits_open_diskfile( 148 #else 149 (void)fits_open_file( 150 #endif 151 &fptr, 152 name, 153 iomode, 154 &status); 155 if (fptr == NULL || status != 0) { 156 char fitsErr[MAX_STRING_LENGTH] 157 ; 158 fits_get_errstatus(status, fitsErr); 159 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 160 PS_ERRORTEXT_psFits_FILENAME_INVALID, 161 name, fitsErr); 162 return NULL; 163 } 164 } 165 166 psFits* fits = psAlloc(sizeof(psFits)); 167 fits->fd = fptr; 168 fits->writable = (iomode == READWRITE); 169 psMemSetDeallocator(fits,(psFreeFunc)fitsFree); 170 171 return fits; 172 } 173 174 bool psMemCheckFits(psPtr ptr) 175 { 176 return ( psMemGetDeallocator(ptr) == (psFreeFunc)fitsFree ); 177 } 178 179 180 bool psFitsMoveExtName(const psFits* fits, 181 const char* extname) 182 { 183 int status = 0; 184 185 if (fits == NULL) { 186 psError(PS_ERR_BAD_PARAMETER_NULL, true, 187 PS_ERRORTEXT_psFits_NULL); 188 return false; 189 } 190 191 if (extname == NULL) { 192 psError(PS_ERR_BAD_PARAMETER_NULL, true, 193 PS_ERRORTEXT_psFits_EXTNAME_NULL); 194 return false; 195 } 196 197 198 if (fits_movnam_hdu(fits->fd, ANY_HDU, (char*)extname, 0, &status) != 0) { 138 ; 139 fits_get_errstatus(status, fitsErr); 140 psError(PS_ERR_IO, true, 141 PS_ERRORTEXT_psFits_FILENAME_CREATE_FAILED, 142 name, fitsErr); 143 return NULL; 144 } 145 } else { 146 #if ( CFITSIO_DISKFILE == 1 ) 147 (void)fits_open_diskfile 148 #else 149 (void)fits_open_file 150 #endif 151 (&fptr, 152 name, 153 iomode, 154 &status); 155 if (fptr == NULL || status != 0) { 156 char fitsErr[MAX_STRING_LENGTH] 157 ; 158 fits_get_errstatus(status, fitsErr); 159 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 160 PS_ERRORTEXT_psFits_FILENAME_INVALID, 161 name, fitsErr); 162 return NULL; 163 } 164 } 165 166 psFits* fits = psAlloc(sizeof(psFits)); 167 fits->fd = fptr; 168 fits->writable = (iomode == READWRITE); 169 psMemSetDeallocator(fits,(psFreeFunc)fitsFree); 170 171 return fits; 172 } 173 174 bool psMemCheckFits(psPtr ptr) 175 { 176 return ( psMemGetDeallocator(ptr) == (psFreeFunc)fitsFree ); 177 } 178 179 180 bool psFitsMoveExtName(const psFits* fits, 181 const char* extname) 182 { 183 int status = 0; 184 185 if (fits == NULL) { 186 psError(PS_ERR_BAD_PARAMETER_NULL, true, 187 PS_ERRORTEXT_psFits_NULL); 188 return false; 189 } 190 191 if (extname == NULL) { 192 psError(PS_ERR_BAD_PARAMETER_NULL, true, 193 PS_ERRORTEXT_psFits_EXTNAME_NULL); 194 return false; 195 } 196 197 198 if (fits_movnam_hdu(fits->fd, ANY_HDU, (char*)extname, 0, &status) != 0) { 199 char fitsErr[MAX_STRING_LENGTH]; 200 fits_get_errstatus(status, fitsErr); 201 psError(PS_ERR_LOCATION_INVALID, true, 202 PS_ERRORTEXT_psFits_EXTNAME_INVALID, 203 extname, fitsErr); 204 return false; 205 } 206 207 return true; 208 } 209 210 bool psFitsMoveExtNum(const psFits* fits, 211 int extnum, 212 bool relative) 213 { 214 if (fits == NULL) { 215 psError(PS_ERR_BAD_PARAMETER_NULL, true, 216 PS_ERRORTEXT_psFits_NULL); 217 return false; 218 } 219 220 int status = 0; 221 int hdutype = 0; 222 223 if (relative) { 224 fits_movrel_hdu(fits->fd, extnum, &hdutype, &status); 225 if (status != 0) { 199 226 char fitsErr[MAX_STRING_LENGTH]; 200 227 fits_get_errstatus(status, fitsErr); 201 228 psError(PS_ERR_LOCATION_INVALID, true, 202 PS_ERRORTEXT_psFits_EXTN AME_INVALID,203 extn ame, fitsErr);229 PS_ERRORTEXT_psFits_EXTNUM_REL_MOVE_FAILED, 230 extnum, fitsErr); 204 231 return false; 205 232 } 206 207 return true; 208 } 209 210 bool psFitsMoveExtNum(const psFits* fits, 211 int extnum, 212 bool relative) 213 { 214 if (fits == NULL) { 215 psError(PS_ERR_BAD_PARAMETER_NULL, true, 216 PS_ERRORTEXT_psFits_NULL); 217 return false; 218 } 219 220 int status = 0; 221 int hdutype = 0; 222 223 if (relative) { 224 fits_movrel_hdu(fits->fd, extnum, &hdutype, &status); 225 if (status != 0) { 226 char fitsErr[MAX_STRING_LENGTH]; 227 fits_get_errstatus(status, fitsErr); 228 psError(PS_ERR_LOCATION_INVALID, true, 229 PS_ERRORTEXT_psFits_EXTNUM_REL_MOVE_FAILED, 230 extnum, fitsErr); 231 return false; 232 } 233 } else { 234 fits_movabs_hdu(fits->fd, extnum+1, &hdutype, &status); 235 if (status != 0) { 236 char fitsErr[MAX_STRING_LENGTH]; 237 fits_get_errstatus(status, fitsErr); 238 psError(PS_ERR_LOCATION_INVALID, true, 239 PS_ERRORTEXT_psFits_EXTNUM_ABS_MOVE_FAILED, 240 extnum, fitsErr); 241 return false; 242 } 243 } 244 245 return true; 246 } 247 248 bool psFitsMoveLast(psFits* fits) 249 { 250 if (fits == NULL) { 251 psError(PS_ERR_BAD_PARAMETER_NULL, true, 252 PS_ERRORTEXT_psFits_NULL); 253 return false; 254 } 255 int size = psFitsGetSize(fits); 256 if (size == 0) { // empty file -- no action needed 257 return true; 258 } else { 259 return psFitsMoveExtNum(fits,size-1,false); 260 } 261 } 262 263 int psFitsGetExtNum(const psFits* fits) 264 { 265 int hdunum; 266 267 if (fits == NULL) { 268 psError(PS_ERR_BAD_PARAMETER_NULL, true, 269 PS_ERRORTEXT_psFits_NULL); 270 return PS_FITS_TYPE_NONE; 271 } 272 273 274 return fits_get_hdu_num(fits->fd,&hdunum) - 1; 275 } 276 277 psString psFitsGetExtName(const psFits* fits) 278 { 279 if (fits == NULL) { 280 psError(PS_ERR_BAD_PARAMETER_NULL, true, 281 PS_ERRORTEXT_psFits_NULL); 282 return NULL; 283 } 284 285 int status = 0; 286 char name[MAX_STRING_LENGTH]; 287 288 if (fits_read_key_str(fits->fd, "EXTNAME", name, NULL, &status) != 0) { 289 status = 0; 290 if (fits_read_key_str(fits->fd, "HDUNAME", name, NULL, &status) != 0) { 291 int num = psFitsGetExtNum(fits); 292 snprintf(name, MAX_STRING_LENGTH, "EXT-%3d",num); 293 } 294 } 295 return psStringCopy(name); 296 } 297 298 bool psFitsSetExtName(psFits* fits, const char* name) 299 { 300 if (fits == NULL) { 301 psError(PS_ERR_BAD_PARAMETER_NULL, true, 302 PS_ERRORTEXT_psFits_NULL); 303 return false; 304 } 305 306 if (name == NULL) { 307 psError(PS_ERR_BAD_PARAMETER_NULL, true, 308 PS_ERRORTEXT_psFits_EXTNAME_NULL); 309 return false; 310 } 311 312 int status = 0; 313 314 if (fits_update_key_str(fits->fd, "EXTNAME", (char*)name, NULL, &status) != 0) { 315 char fitsErr[MAX_STRING_LENGTH]; 316 (void)fits_get_errstatus(status, fitsErr); 317 psError(PS_ERR_IO, true, 318 PS_ERRORTEXT_psFits_WRITE_FAILED, 319 fitsErr); 320 return false; 321 } 322 323 return true; 324 } 325 326 bool psFitsDeleteExtNum(psFits* fits, 327 int extnum, 328 bool relative) 329 { 330 if (fits == NULL) { 331 psError(PS_ERR_BAD_PARAMETER_NULL, true, 332 PS_ERRORTEXT_psFits_NULL); 333 return false; 334 } 335 336 if (! fits->writable) { 337 psError(PS_ERR_IO, true, 338 PS_ERRORTEXT_psFits_NOT_WRITABLE); 339 return false; 340 } 341 342 // move to the specified HDU 343 if (! psFitsMoveExtNum(fits,extnum,relative) ) { 344 psError(PS_ERR_BAD_PARAMETER_VALUE, false, 345 "Failed to delete HDU #%d", 346 extnum); 347 return false; 348 } 349 350 int status = 0; 351 352 // OK, now let's delete the HDU 353 if (fits_delete_hdu(fits->fd, NULL, &status) != 0) { 354 char fitsErr[MAX_STRING_LENGTH]; 355 (void)fits_get_errstatus(status, fitsErr); 356 psError(PS_ERR_IO, true, 357 PS_ERRORTEXT_psFits_WRITE_FAILED, 358 fitsErr); 359 return false; 360 } 361 362 return true; 363 } 364 365 bool psFitsDeleteExtName(psFits* fits, 366 const char* extname) 367 { 368 if (fits == NULL) { 369 psError(PS_ERR_BAD_PARAMETER_NULL, true, 370 PS_ERRORTEXT_psFits_NULL); 371 return false; 372 } 373 374 if (! fits->writable) { 375 psError(PS_ERR_IO, true, 376 PS_ERRORTEXT_psFits_NOT_WRITABLE); 377 return false; 378 } 379 380 // move to the specified HDU 381 if (! psFitsMoveExtName(fits,extname) ) { 382 psError(PS_ERR_BAD_PARAMETER_VALUE, false, 383 "Failed to delete HDU with the name '%s'", 384 extname); 385 return false; 386 } 387 388 389 int status = 0; 390 391 // OK, now let's delete the HDU 392 if (fits_delete_hdu(fits->fd, NULL, &status) != 0) { 393 char fitsErr[MAX_STRING_LENGTH]; 394 (void)fits_get_errstatus(status, fitsErr); 395 psError(PS_ERR_IO, true, 396 PS_ERRORTEXT_psFits_WRITE_FAILED, 397 fitsErr); 398 return false; 399 } 400 401 return true; 402 } 403 404 int psFitsGetSize(const psFits* fits) 405 { 406 if (fits == NULL) { 407 psError(PS_ERR_BAD_PARAMETER_NULL, true, 408 PS_ERRORTEXT_psFits_NULL); 409 return 0; 410 } 411 412 int num = 0; 413 int status = 0; 414 415 if (fits_get_num_hdus(fits->fd, &num, &status) != 0) { 233 } else { 234 fits_movabs_hdu(fits->fd, extnum+1, &hdutype, &status); 235 if (status != 0) { 416 236 char fitsErr[MAX_STRING_LENGTH]; 417 237 fits_get_errstatus(status, fitsErr); 418 238 psError(PS_ERR_LOCATION_INVALID, true, 419 PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED, 420 fitsErr); 421 return 0; 422 } 423 424 return num; 425 } 426 427 psFitsType psFitsGetExtType(const psFits* fits) 428 { 429 if (fits == NULL) { 430 psError(PS_ERR_BAD_PARAMETER_NULL, true, 431 PS_ERRORTEXT_psFits_NULL); 432 return PS_FITS_TYPE_NONE; 433 } 434 435 int status = 0; 436 int hdutype = PS_FITS_TYPE_NONE; 437 438 if (fits_get_hdu_type(fits->fd, &hdutype, &status) != 0) { 439 char fitsErr[MAX_STRING_LENGTH]; 440 fits_get_errstatus(status, fitsErr); 441 psError(PS_ERR_LOCATION_INVALID, true, 442 PS_ERRORTEXT_psFits_GETHDUTYPE_FAILED, 443 fitsErr); 444 return PS_FITS_TYPE_NONE; 445 } 446 447 if (hdutype == PS_FITS_TYPE_IMAGE && 448 psFitsGetExtNum(fits) > 0 && 449 isHDUEmpty(fits)) { 450 return PS_FITS_TYPE_ANY; 451 } 452 453 return hdutype; 454 } 455 456 bool psFitsTruncate(psFits* fits) 457 { 458 if (fits == NULL) { 459 psError(PS_ERR_BAD_PARAMETER_NULL, true, 460 PS_ERRORTEXT_psFits_NULL); 461 return PS_FITS_TYPE_NONE; 462 } 463 464 if (! fits->writable) { 465 psError(PS_ERR_IO, true, 466 PS_ERRORTEXT_psFits_NOT_WRITABLE); 467 return PS_FITS_TYPE_NONE; 468 } 469 470 int newEnd = psFitsGetExtNum(fits); 471 472 psFitsMoveLast(fits); 473 int end = psFitsGetExtNum(fits); 474 475 // delete HDUs from end to beginning position + 1; 476 for (int lcv=end;lcv > newEnd; lcv--) { 477 if (! psFitsDeleteExtNum(fits,lcv,false)) { 478 // failed to delete an HDU!? 479 psError(PS_ERR_UNKNOWN, false, 480 "Failed to truncate file. HDU #%d out of %d could not be deleted.", 481 lcv,end); 482 return false; 483 } 484 } 485 239 PS_ERRORTEXT_psFits_EXTNUM_ABS_MOVE_FAILED, 240 extnum, fitsErr); 241 return false; 242 } 243 } 244 245 return true; 246 } 247 248 bool psFitsMoveLast(psFits* fits) 249 { 250 if (fits == NULL) { 251 psError(PS_ERR_BAD_PARAMETER_NULL, true, 252 PS_ERRORTEXT_psFits_NULL); 253 return false; 254 } 255 int size = psFitsGetSize(fits); 256 if (size == 0) { // empty file -- no action needed 486 257 return true; 487 } 258 } else { 259 return psFitsMoveExtNum(fits,size-1,false); 260 } 261 } 262 263 int psFitsGetExtNum(const psFits* fits) 264 { 265 int hdunum; 266 267 if (fits == NULL) { 268 psError(PS_ERR_BAD_PARAMETER_NULL, true, 269 PS_ERRORTEXT_psFits_NULL); 270 return PS_FITS_TYPE_NONE; 271 } 272 273 274 return fits_get_hdu_num(fits->fd,&hdunum) - 1; 275 } 276 277 psString psFitsGetExtName(const psFits* fits) 278 { 279 if (fits == NULL) { 280 psError(PS_ERR_BAD_PARAMETER_NULL, true, 281 PS_ERRORTEXT_psFits_NULL); 282 return NULL; 283 } 284 285 int status = 0; 286 char name[MAX_STRING_LENGTH]; 287 288 if (fits_read_key_str(fits->fd, "EXTNAME", name, NULL, &status) != 0) { 289 status = 0; 290 if (fits_read_key_str(fits->fd, "HDUNAME", name, NULL, &status) != 0) { 291 int num = psFitsGetExtNum(fits); 292 snprintf(name, MAX_STRING_LENGTH, "EXT-%3d",num); 293 } 294 } 295 return psStringCopy(name); 296 } 297 298 bool psFitsSetExtName(psFits* fits, const char* name) 299 { 300 if (fits == NULL) { 301 psError(PS_ERR_BAD_PARAMETER_NULL, true, 302 PS_ERRORTEXT_psFits_NULL); 303 return false; 304 } 305 306 if (name == NULL) { 307 psError(PS_ERR_BAD_PARAMETER_NULL, true, 308 PS_ERRORTEXT_psFits_EXTNAME_NULL); 309 return false; 310 } 311 312 int status = 0; 313 314 if (fits_update_key_str(fits->fd, "EXTNAME", (char*)name, NULL, &status) != 0) { 315 char fitsErr[MAX_STRING_LENGTH]; 316 (void)fits_get_errstatus(status, fitsErr); 317 psError(PS_ERR_IO, true, 318 PS_ERRORTEXT_psFits_WRITE_FAILED, 319 fitsErr); 320 return false; 321 } 322 323 return true; 324 } 325 326 bool psFitsDeleteExtNum(psFits* fits, 327 int extnum, 328 bool relative) 329 { 330 if (fits == NULL) { 331 psError(PS_ERR_BAD_PARAMETER_NULL, true, 332 PS_ERRORTEXT_psFits_NULL); 333 return false; 334 } 335 336 if (! fits->writable) { 337 psError(PS_ERR_IO, true, 338 PS_ERRORTEXT_psFits_NOT_WRITABLE); 339 return false; 340 } 341 342 // move to the specified HDU 343 if (! psFitsMoveExtNum(fits,extnum,relative) ) { 344 psError(PS_ERR_BAD_PARAMETER_VALUE, false, 345 "Failed to delete HDU #%d", 346 extnum); 347 return false; 348 } 349 350 int status = 0; 351 352 // OK, now let's delete the HDU 353 if (fits_delete_hdu(fits->fd, NULL, &status) != 0) { 354 char fitsErr[MAX_STRING_LENGTH]; 355 (void)fits_get_errstatus(status, fitsErr); 356 psError(PS_ERR_IO, true, 357 PS_ERRORTEXT_psFits_WRITE_FAILED, 358 fitsErr); 359 return false; 360 } 361 362 return true; 363 } 364 365 bool psFitsDeleteExtName(psFits* fits, 366 const char* extname) 367 { 368 if (fits == NULL) { 369 psError(PS_ERR_BAD_PARAMETER_NULL, true, 370 PS_ERRORTEXT_psFits_NULL); 371 return false; 372 } 373 374 if (! fits->writable) { 375 psError(PS_ERR_IO, true, 376 PS_ERRORTEXT_psFits_NOT_WRITABLE); 377 return false; 378 } 379 380 // move to the specified HDU 381 if (! psFitsMoveExtName(fits,extname) ) { 382 psError(PS_ERR_BAD_PARAMETER_VALUE, false, 383 "Failed to delete HDU with the name '%s'", 384 extname); 385 return false; 386 } 387 388 389 int status = 0; 390 391 // OK, now let's delete the HDU 392 if (fits_delete_hdu(fits->fd, NULL, &status) != 0) { 393 char fitsErr[MAX_STRING_LENGTH]; 394 (void)fits_get_errstatus(status, fitsErr); 395 psError(PS_ERR_IO, true, 396 PS_ERRORTEXT_psFits_WRITE_FAILED, 397 fitsErr); 398 return false; 399 } 400 401 return true; 402 } 403 404 int psFitsGetSize(const psFits* fits) 405 { 406 if (fits == NULL) { 407 psError(PS_ERR_BAD_PARAMETER_NULL, true, 408 PS_ERRORTEXT_psFits_NULL); 409 return 0; 410 } 411 412 int num = 0; 413 int status = 0; 414 415 if (fits_get_num_hdus(fits->fd, &num, &status) != 0) { 416 char fitsErr[MAX_STRING_LENGTH]; 417 fits_get_errstatus(status, fitsErr); 418 psError(PS_ERR_LOCATION_INVALID, true, 419 PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED, 420 fitsErr); 421 return 0; 422 } 423 424 return num; 425 } 426 427 psFitsType psFitsGetExtType(const psFits* fits) 428 { 429 if (fits == NULL) { 430 psError(PS_ERR_BAD_PARAMETER_NULL, true, 431 PS_ERRORTEXT_psFits_NULL); 432 return PS_FITS_TYPE_NONE; 433 } 434 435 int status = 0; 436 int hdutype = PS_FITS_TYPE_NONE; 437 438 if (fits_get_hdu_type(fits->fd, &hdutype, &status) != 0) { 439 char fitsErr[MAX_STRING_LENGTH]; 440 fits_get_errstatus(status, fitsErr); 441 psError(PS_ERR_LOCATION_INVALID, true, 442 PS_ERRORTEXT_psFits_GETHDUTYPE_FAILED, 443 fitsErr); 444 return PS_FITS_TYPE_NONE; 445 } 446 447 if (hdutype == PS_FITS_TYPE_IMAGE && 448 psFitsGetExtNum(fits) > 0 && 449 isHDUEmpty(fits)) { 450 return PS_FITS_TYPE_ANY; 451 } 452 453 return hdutype; 454 } 455 456 bool psFitsTruncate(psFits* fits) 457 { 458 if (fits == NULL) { 459 psError(PS_ERR_BAD_PARAMETER_NULL, true, 460 PS_ERRORTEXT_psFits_NULL); 461 return PS_FITS_TYPE_NONE; 462 } 463 464 if (! fits->writable) { 465 psError(PS_ERR_IO, true, 466 PS_ERRORTEXT_psFits_NOT_WRITABLE); 467 return PS_FITS_TYPE_NONE; 468 } 469 470 int newEnd = psFitsGetExtNum(fits); 471 472 psFitsMoveLast(fits); 473 int end = psFitsGetExtNum(fits); 474 475 // delete HDUs from end to beginning position + 1; 476 for (int lcv=end;lcv > newEnd; lcv--) { 477 if (! psFitsDeleteExtNum(fits,lcv,false)) { 478 // failed to delete an HDU!? 479 psError(PS_ERR_UNKNOWN, false, 480 "Failed to truncate file. HDU #%d out of %d could not be deleted.", 481 lcv,end); 482 return false; 483 } 484 } 485 486 return true; 487 }
Note:
See TracChangeset
for help on using the changeset viewer.
