@@ -658,6 +658,7 @@ STATUS write_oi_fits(const char *filename, oi_fits oi, STATUS *pStatus)
658658STATUS 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