Skip to content

Commit 197c175

Browse files
committed
Skip over non-essential tables if reading them fails.
Make read_oi_file() skip over any OI_CORR, OI_INSPOL, OI_VIS, OI_VIS2, OI_T3, or OI_FLUX for which the table read function returns an error.
1 parent 60cdf57 commit 197c175

File tree

1 file changed

+80
-40
lines changed

1 file changed

+80
-40
lines changed

src/oifitslib/oifile.c

Lines changed: 80 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,7 @@ STATUS write_oi_fits(const char *filename, oi_fits oi, STATUS *pStatus)
658658
STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
659659
{
660660
const char function[] = "read_oi_fits";
661+
char desc[FLEN_STATUS];
661662
fitsfile *fptr;
662663
int hdutype;
663664
oi_array *pArray;
@@ -729,46 +730,69 @@ STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
729730
*pStatus = 0; /* reset EOF */
730731
fits_clear_errmark();
731732

732-
/* Read all OI_CORR tables */
733+
/* Read all OI_CORR tables, skipping over failed tables */
733734
pOi->numCorr = 0;
734735
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
735736
while (TRUE) {
736737
pCorr = chkmalloc(sizeof(oi_corr));
737738
fits_write_errmark();
738-
if (read_next_oi_corr(fptr, pCorr, pStatus))
739-
break; /* no more OI_CORR */
739+
if (read_next_oi_corr(fptr, pCorr, pStatus)) {
740+
free(pCorr);
741+
fits_clear_errmark();
742+
if (*pStatus == END_OF_FILE) {
743+
*pStatus = 0;
744+
break; /* no more OI_CORR */
745+
}
746+
fits_get_errstatus(*pStatus, desc);
747+
fprintf(stderr, "\nSkipping bad OI_CORR (%s)\n", desc);
748+
*pStatus = 0;
749+
continue;
750+
}
740751
pOi->corrList = g_list_append(pOi->corrList, pCorr);
741752
++pOi->numCorr;
742753
}
743-
free(pCorr);
744-
if (*pStatus != END_OF_FILE) goto except;
745-
*pStatus = 0; /* reset EOF */
746-
fits_clear_errmark();
747754

748-
/* Read all OI_INSPOL tables */
755+
/* Read all OI_INSPOL tables, skipping over failed tables */
749756
pOi->numInspol = 0;
750757
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
751758
while (TRUE) {
752759
pInspol = chkmalloc(sizeof(oi_inspol));
753760
fits_write_errmark();
754-
if (read_next_oi_inspol(fptr, pInspol, pStatus))
755-
break; /* no more OI_INSPOL */
761+
if (read_next_oi_inspol(fptr, pInspol, pStatus)) {
762+
free(pInspol);
763+
fits_clear_errmark();
764+
if (*pStatus == END_OF_FILE) {
765+
*pStatus = 0;
766+
break; /* no more OI_INSPOL */
767+
}
768+
fits_get_errstatus(*pStatus, desc);
769+
fprintf(stderr, "\nSkipping bad OI_INSPOL (%s)\n", desc);
770+
*pStatus = 0;
771+
continue;
772+
}
756773
pOi->inspolList = g_list_append(pOi->inspolList, pInspol);
757774
++pOi->numInspol;
758775
}
759-
free(pInspol);
760-
if (*pStatus != END_OF_FILE) goto except;
761-
*pStatus = 0; /* reset EOF */
762-
fits_clear_errmark();
763776

764777
/* Read all OI_VIS, hash-tabling corresponding array, wavelength and
765-
* corr tables */
778+
* corr tables, skipping over failed tables */
766779
pOi->numVis = 0;
767780
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
768781
while (TRUE) {
769782
pVis = chkmalloc(sizeof(oi_vis));
770783
fits_write_errmark();
771-
if (read_next_oi_vis(fptr, pVis, pStatus)) break; /* no more OI_VIS */
784+
if (read_next_oi_vis(fptr, pVis, pStatus)) {
785+
free(pVis);
786+
fits_clear_errmark();
787+
if (*pStatus == END_OF_FILE) {
788+
*pStatus = 0;
789+
break; /* no more OI_VIS */
790+
}
791+
fits_get_errstatus(*pStatus, desc);
792+
fprintf(stderr, "\nSkipping bad OI_VIS (%s)\n", desc);
793+
*pStatus = 0;
794+
continue;
795+
}
772796
pOi->visList = g_list_append(pOi->visList, pVis);
773797
++pOi->numVis;
774798
if (strlen(pVis->arrname) > 0) {
@@ -785,19 +809,26 @@ STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
785809
find_oi_corr(pOi, pVis->corrname));
786810
}
787811
}
788-
free(pVis);
789-
if (*pStatus != END_OF_FILE) goto except;
790-
*pStatus = 0; /* reset EOF */
791-
fits_clear_errmark();
792812

793813
/* Read all OI_VIS2, hash-tabling corresponding array, wavelength
794-
* and corr tables */
814+
* and corr tables, skipping over failed tables */
795815
pOi->numVis2 = 0;
796816
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
797817
while (TRUE) {
798818
pVis2 = chkmalloc(sizeof(oi_vis2));
799819
fits_write_errmark();
800-
if (read_next_oi_vis2(fptr, pVis2, pStatus)) break; /* no more OI_VIS2 */
820+
if (read_next_oi_vis2(fptr, pVis2, pStatus)) {
821+
free(pVis2);
822+
fits_clear_errmark();
823+
if (*pStatus == END_OF_FILE) {
824+
*pStatus = 0;
825+
break; /* no more OI_VIS2 */
826+
}
827+
fits_get_errstatus(*pStatus, desc);
828+
fprintf(stderr, "\nSkipping bad OI_VIS2 (%s)\n", desc);
829+
*pStatus = 0;
830+
continue;
831+
}
801832
pOi->vis2List = g_list_append(pOi->vis2List, pVis2);
802833
++pOi->numVis2;
803834
if (strlen(pVis2->arrname) > 0) {
@@ -814,19 +845,26 @@ STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
814845
find_oi_corr(pOi, pVis2->corrname));
815846
}
816847
}
817-
free(pVis2);
818-
if (*pStatus != END_OF_FILE) goto except;
819-
*pStatus = 0; /* reset EOF */
820-
fits_clear_errmark();
821848

822849
/* Read all OI_T3, hash-tabling corresponding array, wavelength and
823-
* corr tables */
850+
* corr tables, skipping over failed tables */
824851
pOi->numT3 = 0;
825852
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
826853
while (TRUE) {
827854
pT3 = chkmalloc(sizeof(oi_t3));
828855
fits_write_errmark();
829-
if (read_next_oi_t3(fptr, pT3, pStatus)) break; /* no more OI_T3 */
856+
if (read_next_oi_t3(fptr, pT3, pStatus)) {
857+
free(pT3);
858+
fits_clear_errmark();
859+
if (*pStatus == END_OF_FILE) {
860+
*pStatus = 0;
861+
break; /* no more OI_T3 */
862+
}
863+
fits_get_errstatus(*pStatus, desc);
864+
fprintf(stderr, "\nSkipping bad OI_T3 (%s)\n", desc);
865+
*pStatus = 0;
866+
continue;
867+
}
830868
pOi->t3List = g_list_append(pOi->t3List, pT3);
831869
++pOi->numT3;
832870
if (strlen(pT3->arrname) > 0) {
@@ -843,20 +881,26 @@ STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
843881
find_oi_corr(pOi, pT3->corrname));
844882
}
845883
}
846-
free(pT3);
847-
if (*pStatus != END_OF_FILE) goto except;
848-
*pStatus = 0; /* reset EOF */
849-
fits_clear_errmark();
850884

851-
/* Read all OI_FLUX, hash-tabling corresponding array &
852-
* wavelength tables */
885+
/* Read all OI_FLUX, hash-tabling corresponding array & wavelength
886+
* tables, skipping over failed tables */
853887
pOi->numFlux = 0;
854888
fits_movabs_hdu(fptr, 1, &hdutype, pStatus); /* back to start */
855889
while (TRUE) {
856890
pFlux = chkmalloc(sizeof(oi_flux));
857891
fits_write_errmark();
858-
if (read_next_oi_flux(fptr, pFlux, pStatus))
859-
break; /* no more OI_FLUX */
892+
if (read_next_oi_flux(fptr, pFlux, pStatus)) {
893+
free(pFlux);
894+
fits_clear_errmark();
895+
if (*pStatus == END_OF_FILE) {
896+
*pStatus = 0;
897+
break; /* no more OI_FLUX */
898+
}
899+
fits_get_errstatus(*pStatus, desc);
900+
fprintf(stderr, "\nSkipping bad OI_FLUX (%s)\n", desc);
901+
*pStatus = 0;
902+
continue;
903+
}
860904
pOi->fluxList = g_list_append(pOi->fluxList, pFlux);
861905
++pOi->numFlux;
862906
if (strlen(pFlux->arrname) > 0) {
@@ -868,10 +912,6 @@ STATUS read_oi_fits(const char *filename, oi_fits *pOi, STATUS *pStatus)
868912
g_hash_table_insert(pOi->wavelengthHash, pFlux->insname,
869913
find_oi_wavelength(pOi, pFlux->insname));
870914
}
871-
free(pFlux);
872-
if (*pStatus != END_OF_FILE) goto except;
873-
*pStatus = 0; /* reset EOF */
874-
fits_clear_errmark();
875915

876916
if (is_oi_fits_one(pOi))
877917
set_oi_header(pOi);

0 commit comments

Comments
 (0)