/*
* fitsconv.c
*
* Functions for converting LDAC FITS catalogs.
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*
* This file part of: AstrOmatic FITS/LDAC library
*
* Copyright: (C) 1995-2012 Emmanuel Bertin -- IAP/CNRS/UPMC
*
* License: GNU General Public License
*
* AstrOmatic software is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
* AstrOmatic software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with AstrOmatic software.
* If not, see .
*
* Last modified: 13/06/2012
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include "fitscat_defs.h"
#include "fitscat.h"
/****** asc2bin_tab ***********************************************************
PROTO tabstruct *asc2bin_tab(catstruct *catin, char *tabinname,
catstruct *catout, char *taboutname)
PURPOSE Convert an ASCII table to a BINARY table
which is then stored in a destination catalog.
INPUT Pointer to the input catalog,
Name of the input ASCII table,
Pointer to the output catalog,
Name of the output binary table.
OUTPUT RETURN_OK if the ASCII table was transformed, and RETURN_ERROR
otherwise.
NOTES This function can be used to stick the binary translation of
similar ASCII tables.
AUTHOR E. Bertin (IAP & Leiden observatory)
VERSION 25/09/2004
***/
tabstruct *asc2bin_tab(catstruct *catin, char *tabinname, catstruct *catout,
char *taboutname)
{
catstruct *tabcat;
keystruct *key;
tabstruct *tabin,*tabout;
char comment[82], keyword[16], ptr[82];
h_type htype;
t_type ttype;
char *buf, *lptr;
int i;
/*Convert the table name to a pointer*/
if (!(tabin = name_to_tab(catin, tabinname, 0)))
return NULL;
/*Get the original catalog*/
tabcat = tabin->cat;
/*Create a new binary table*/
tabout = new_tab(taboutname);
/*Alloc. mem. for the whole ASCII table at once (should not be very large)*/
QMALLOC(buf, char, tabin->tabsize);
/*Now read all the elements from the original table*/
if (open_cat(tabcat, READ_ONLY) != RETURN_OK)
error(EXIT_FAILURE, "*Error*: Cannot access ", tabcat->filename);
QFSEEK(tabcat->file, tabin->bodypos, SEEK_SET, tabcat->filename);
QFREAD(buf, tabin->tabsize, tabcat->file, tabcat->filename);
if (close_cat(tabcat) != RETURN_OK)
error(EXIT_FAILURE, "*Error*: Problem while closing", tabcat->filename);
lptr = buf;
for (i=tabin->tabsize/80; i-- && strncmp(lptr, "END ", 8);)
{
/*Interprete the next FITS line */
if (fitspick(lptr, keyword, ptr, &htype, &ttype, comment) != RETURN_OK) {
char line[81];
int qflag=1;
strncpy(line, lptr, 80);
line[80] = '\0';
QFPRINTF(OUTPUT, line);
warning("*Warning*: incorrect FITS field will be ignored in ",
tabcat->filename);
}
if (htype != H_COMMENT)
{
/*----Create a new key and fill it with the right parameters*/
key = new_key(keyword);
strcpy(key->comment, comment+strspn(comment, " "));
key->htype = htype;
key->ttype = ttype;
key->nbytes = t_size[ttype];
/*----!!Temporary (?) solution for STRINGS*/
if (htype==H_STRING)
{
key->naxis = 1;
QMALLOC(key->naxisn, int, 1);
key->naxisn[0] = 32;
key->nbytes *= key->naxisn[0];
}
key->nobj = 1;
/*----Allocate memory and copy data in the same time*/
QMEMCPY(ptr, key->ptr, char, key->nbytes);
if (add_key(key, tabout, 0)==RETURN_ERROR)
{
sprintf(comment, "%s keyword found twice in ",
keyword);
warning(comment, tabcat->filename);
}
}
lptr += 80;
}
free(buf);
update_tab(tabout);
return tabout;
}
/****** ttypeconv ************************************************************
PROTO void ttypeconv(void *ptrin, void *ptrout,
t_type ttypein, t_type ttypeout)
PURPOSE Convert data from one type to another.
INPUT Pointer to element to convert,
destination pointer to the converted element,
t_type of the element to convert,
t_type of the converted element.
OUTPUT -.
NOTES ttypeconv does not yet handle arrays.
AUTHOR E. Bertin (IAP)
VERSION 13/06/2012
***/
void ttypeconv(void *ptrin, void *ptrout, t_type ttypein, t_type ttypeout)
{
// union {char tbyte; short tshort; int tlong; LONGLONG tlonglong;
// float tfloat; double tdouble; char tstring;} ival;
#ifdef HAVE_LONG_LONG_INT
#define OUTCONV(x, y) \
switch(y) \
{ \
case T_BYTE: \
case T_STRING: \
*((char *)ptrout) = (char)x; \
break; \
case T_SHORT: \
*((short *)ptrout) = (short)x; \
break; \
case T_LONG: \
*((int *)ptrout) = (int)x; \
break; \
case T_LONGLONG: \
*((SLONGLONG *)ptrout) = (SLONGLONG)x; \
break; \
case T_FLOAT: \
*((float *)ptrout) = (float)x; \
break; \
case T_DOUBLE: \
*((double *)ptrout) = (double)x; \
break; \
default: \
break; \
}
#else
#define OUTCONV(x, y) \
switch(y) \
{ \
case T_BYTE: \
case T_STRING: \
*((char *)ptrout) = (char)x; \
break; \
case T_SHORT: \
*((short *)ptrout) = (short)x; \
break; \
case T_LONG: \
*((int *)ptrout) = (int)x; \
break; \
case T_FLOAT: \
*((float *)ptrout) = (float)x; \
break; \
case T_DOUBLE: \
*((double *)ptrout) = (double)x; \
break; \
default: \
break; \
}
#endif
switch(ttypein)
{
case T_BYTE:
case T_STRING:
OUTCONV(*(char *)ptrin, ttypeout);
break;
case T_SHORT:
OUTCONV(*(short *)ptrin, ttypeout);
break;
case T_LONG:
OUTCONV(*(int *)ptrin, ttypeout);
break;
#ifdef HAVE_LONG_LONG_INT
case T_LONGLONG:
OUTCONV(*(SLONGLONG *)ptrin, ttypeout);
break;
#endif
case T_FLOAT:
OUTCONV(*(float *)ptrin, ttypeout);
break;
case T_DOUBLE:
OUTCONV(*(double *)ptrin, ttypeout);
break;
default:
break;
}
return;
}