/* action for struct discovery */ int s_d_prog_struct(void *in, typ type, void *out) { /* Service−agnostic, Program−specific */ if (type == TYPE_STRUCT_tagged_union_i) { struct tagged_union *in_u = in ; struct tagged_union *out_u = out; visit (&in_u->tag, TYPE_INT_i, &out_u->tag); if(in_u->tag) visit(&in_u->u.x, TYPE_INT_i, &out_u->u.x); else visit(&in_u->u.c, TYPE_CHAR_i, &out_u->u.c); return 0; } /*deserialization*/ if(is_reading() ) { return deserial_struct(in, type, out); } /*serialization*/ if(is_writing() ) { return serial_struct(in, type, out); } return 0; }
int fitstable_close(fitstable_t* tab) { int i; int rtn = 0; if (!tab) return 0; if (is_writing(tab)) { if (fclose(tab->fid)) { SYSERROR("Failed to close output file %s", tab->fn); rtn = -1; } } if (tab->anq) { anqfits_close(tab->anq); } if (tab->readfid) { fclose(tab->readfid); } if (tab->primheader) qfits_header_destroy(tab->primheader); if (tab->header) qfits_header_destroy(tab->header); if (tab->table) qfits_table_close(tab->table); free(tab->fn); for (i=0; i<ncols(tab); i++) { fitscol_t* col = getcol(tab, i); free(col->colname); free(col->units); } bl_free(tab->cols); if (tab->br) { buffered_read_free(tab->br); free(tab->br); } if (tab->rows) { bl_free(tab->rows); } if (tab->extensions) { for (i=0; i<bl_size(tab->extensions); i++) { fitsext_t* ext = bl_access(tab->extensions, i); if (ext->rows != tab->rows) bl_free(ext->rows); if (ext->header != tab->header) qfits_header_destroy(ext->header); if (ext->table != tab->table) qfits_table_close(ext->table); } bl_free(tab->extensions); } free(tab); return rtn; }
void fitstable_next_extension(fitstable_t* tab) { if (is_writing(tab)) fits_pad_file(tab->fid); if (in_memory(tab)) { fitsext_t ext; if (!tab->table) return; // update NAXIS2 fitstable_fix_header(tab); ext.table = tab->table; ext.header = tab->header; ext.rows = tab->rows; bl_append(tab->extensions, &ext); tab->rows = NULL; } else { qfits_table_close(tab->table); qfits_header_destroy(tab->header); } tab->extension++; tab->table = NULL; tab->header = NULL; }