/*============================================================================ WCSLIB 4.3 - an implementation of the FITS WCS standard. Copyright (C) 1995-2007, Mark Calabretta This file is part of WCSLIB. WCSLIB is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. WCSLIB 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with WCSLIB. If not, see . Correspondence concerning WCSLIB may be directed to: Internet email: mcalabre@atnf.csiro.au Postal address: Dr. Mark Calabretta Australia Telescope National Facility, CSIRO PO Box 76 Epping NSW 1710 AUSTRALIA Author: Mark Calabretta, Australia Telescope National Facility http://www.atnf.csiro.au/~mcalabre/index.html $Id: fitshdr_f.c,v 4.3 2007/12/27 05:48:07 cal103 Exp $ *===========================================================================*/ #include #include #include #include #include /* Fortran name mangling. */ #include #define keyidput_ F77_FUNC(keyidput, KEYIDPUT) #define keyidget_ F77_FUNC(keyidget, KEYIDGET) #define keyget_ F77_FUNC(keyget, KEYGET) #define fitshdr_ F77_FUNC(fitshdr, FITSHDR) #define freekeys_ F77_FUNC(freekeys, FREEKEYS) #define KEYID_NAME 100 #define KEYID_COUNT 101 #define KEYID_IDX 102 #define KEY_KEYNO 200 #define KEY_KEYID 201 #define KEY_STATUS 202 #define KEY_KEYWORD 203 #define KEY_TYPE 204 #define KEY_KEYVALUE 205 #define KEY_ULEN 206 #define KEY_COMMENT 207 /*--------------------------------------------------------------------------*/ int keyidput_(int *keyid, const int *i, const int *what, const void *value) { const char *cvalp; struct fitskeyid *kidp; /* Cast pointers. */ kidp = (struct fitskeyid *)keyid + *i; cvalp = (const char *)value; switch (*what) { case KEYID_NAME: strncpy(kidp->name, cvalp, 12); wcsutil_null_fill(12, kidp->name); break; default: return 1; } return 0; } /*--------------------------------------------------------------------------*/ int keyidget_(const int *keyid, const int *i, const int *what, void *value) { char *cvalp; int *ivalp; const struct fitskeyid *keyidp; /* Cast pointers. */ keyidp = (const struct fitskeyid *)keyid + *i; cvalp = (char *)value; ivalp = (int *)value; switch (*what) { case KEYID_NAME: strncpy(cvalp, keyidp->name, 12); wcsutil_blank_fill(12, cvalp); break; case KEYID_COUNT: *ivalp = keyidp->count; break; case KEYID_IDX: *(ivalp++) = keyidp->idx[0]; *(ivalp++) = keyidp->idx[1]; break; default: return 1; } return 0; } /*--------------------------------------------------------------------------*/ int keyget_( const int *keys, const int *i, const int *what, void *value, int *nc) { char *cvalp, text[32]; int *ivalp, j; double *dvalp; const struct fitskey *keyp; /* Cast pointers. */ keyp = *((const struct fitskey **)keys) + *i; cvalp = (char *)value; ivalp = (int *)value; dvalp = (double *)value; *nc = 1; switch (*what) { case KEY_KEYNO: *ivalp = keyp->keyno; break; case KEY_KEYID: *ivalp = keyp->keyid; break; case KEY_STATUS: *ivalp = keyp->status; break; case KEY_KEYWORD: *nc = strlen(keyp->keyword); strncpy(cvalp, keyp->keyword, 12); wcsutil_blank_fill(12, cvalp); break; case KEY_TYPE: *ivalp = keyp->type; break; case KEY_KEYVALUE: switch (abs(keyp->type)%10) { case 1: case 2: /* Logical and 32-bit integer. */ *ivalp = keyp->keyvalue.i; break; case 3: /* 64-bit integer. */ *nc = 3; #ifdef WCSLIB_INT64 sprintf(text, "%28.27lld", keyp->keyvalue.k); sscanf(text+1, "%9d%9d%9d", ivalp+2, ivalp+1, ivalp); if (*text == '-') { ivalp[0] *= -1; ivalp[1] *= -1; ivalp[2] *= -1; } #else *(ivalp++) = keyp->keyvalue.k[0]; *(ivalp++) = keyp->keyvalue.k[1]; *(ivalp++) = keyp->keyvalue.k[2]; #endif break; case 4: /* Very long integer. */ *nc = 8; for (j = 0; j < 8; j++) { *(ivalp++) = keyp->keyvalue.l[j]; } break; case 5: /* Floating point. */ *dvalp = keyp->keyvalue.f; break; case 6: case 7: /* Integer complex and floating point complex. */ *nc = 2; *(dvalp++) = keyp->keyvalue.c[0]; *(dvalp++) = keyp->keyvalue.c[1]; break; case 8: /* String or part of a continued string. */ *nc = strlen(keyp->keyvalue.s); strncpy(cvalp, keyp->keyvalue.s, 72); wcsutil_blank_fill(72, cvalp); break; default: /* No value. */ break; } break; case KEY_ULEN: *ivalp = keyp->ulen; break; case KEY_COMMENT: *nc = strlen(keyp->comment); strncpy(cvalp, keyp->comment, 84); wcsutil_blank_fill(84, cvalp); break; default: return 1; } return 0; } /*--------------------------------------------------------------------------*/ int fitshdr_( const char header[], const int *nkeyrec, const int *nkeyids, int *keyids, int *nreject, int *keys) { return fitshdr(header, *nkeyrec, *nkeyids, (struct fitskeyid *)keyids, nreject, (struct fitskey **)keys); } /*--------------------------------------------------------------------------*/ int freekeys_(int *keys) { free(*((struct fitskey **)keys)); *keys = 0; return 0; }