Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}