/*============================================================================
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: tunits.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $
*=============================================================================
*
* tunits tests wcsulex(), wcsutrn(), and wcsunits() the FITS units
* specification parser, translator and converter.
*
*---------------------------------------------------------------------------*/
#include
#include
#include
#include
#include
int main()
{
char have[80], want[80];
int func, i, interactive, status;
double offset, power, scale, units[WCSUNITS_NTYPE];
interactive = isatty(0);
printf("Testing FITS unit specification parser (tunits.c)\n"
"-------------------------------------------------\n");
if (interactive) printf("\nTo test wcsulex(), enter when prompted "
"with \"Unit string (want):\".\n");
while (1) {
if (interactive) printf("\nUnit string (have): ");
if (!fgets(have, 80, stdin)) break;
have[strlen(have)-1] = '\0';
if (!interactive) printf("\nUnit string (have): %s\n", have);
if ((status = wcsutrn(7, have)) >= 0) {
printf(" Translation: %s", have);
if (status == 0) {
printf("\n");
} else {
printf(" (WARNING: %s)\n", wcsunits_errmsg[status]);
}
}
if (interactive) printf("Unit string (want): ");
if (!fgets(want, 80, stdin)) break;
want[strlen(want)-1] = '\0';
if (*want) {
if (!interactive) printf("Unit string (want): %s\n", want);
if ((status = wcsutrn(7, want)) >= 0) {
printf(" Translation: %s", want);
if (status == 0) {
printf("\n");
} else {
printf(" (WARNING: %s)\n", wcsunits_errmsg[status]);
}
}
printf("Conversion: \"%s\" -> \"%s\"\n", have, want);
if ((status = wcsunits(have, want, &scale, &offset, &power))) {
printf("wcsunits ERROR %d: %s.\n", status,
wcsunits_errmsg[status]);
continue;
}
printf(" = %s", (power == 1.0) ? "" : "(");
if (scale == 1.0) {
printf("value");
} else {
printf("%.8g * value", scale);
}
if (offset != 0.0) {
printf(" + %.8g", offset);
}
if (power == 1.0) {
printf("\n");
} else {
printf(")^%.8g\n", power);
}
} else {
/* Parse the unit string. */
printf(" Parsing: \"%s\"\n", have);
if ((status = wcsulex(have, &func, &scale, units))) {
printf("wcsulex ERROR %d: %s.\n", status,
wcsunits_errmsg[status]);
continue;
}
printf("%15.8g *\n", scale);
for (i = 0; i < WCSUNITS_NTYPE; i++) {
if (units[i] != 0.0) {
printf("%11.2f %s", units[i], wcsunits_types[i]);
if (strlen(wcsunits_units[i])) {
printf(" (%s)\n", wcsunits_units[i]);
} else {
printf("\n");
}
}
}
}
}
printf("\n");
return 0;
}