summaryrefslogtreecommitdiffstats
path: root/funtools/wcs/iget.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 17:38:41 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 17:38:41 (GMT)
commit5b44fb0d6530c4ff66a446afb69933aa8ffd014f (patch)
treee059f66d1f612e21fe9d83f9620c8715530353ec /funtools/wcs/iget.c
parentda2e3d212171bbe64c1af39114fd067308656990 (diff)
parent23c7930d27fe11c4655e1291a07a821dbbaba78d (diff)
downloadblt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.zip
blt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.tar.gz
blt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.tar.bz2
Merge commit '23c7930d27fe11c4655e1291a07a821dbbaba78d' as 'funtools'
Diffstat (limited to 'funtools/wcs/iget.c')
-rw-r--r--funtools/wcs/iget.c531
1 files changed, 531 insertions, 0 deletions
diff --git a/funtools/wcs/iget.c b/funtools/wcs/iget.c
new file mode 100644
index 0000000..58e54f7
--- /dev/null
+++ b/funtools/wcs/iget.c
@@ -0,0 +1,531 @@
+/*** File libwcs/iget.c
+ *** January 4, 2007
+ *** By Jessica Mink, jmink@cfa.harvard.edu
+ *** Harvard-Smithsonian Center for Astrophysics
+ *** Copyright (C) 1998-2007
+ *** Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+
+ This library 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 2 of the License, or (at your option) any later version.
+
+ This library 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 this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Correspondence concerning WCSTools should be addressed as follows:
+ Internet email: jmink@cfa.harvard.edu
+ Postal address: Jessica Mink
+ Smithsonian Astrophysical Observatory
+ 60 Garden St.
+ Cambridge, MA 02138 USA
+
+ * Module: iget.c (Get IRAF FITS Header parameter values)
+ * Purpose: Extract values for variables from IRAF keyword value string
+ * Subroutine: mgeti4 (hstring,mkey,keyword,ival) returns long integer
+ * Subroutine: mgetr8 (hstring,mkey,keyword,dval) returns double
+ * Subroutine: mgetstr (hstring,mkey,keyword,lstr,str) returns character string
+ * Subroutine: igeti4 (hstring,keyword,ival) returns long integer
+ * Subroutine: igetr4 (hstring,keyword,rval) returns real
+ * Subroutine: igetr8 (hstring,keyword,dval) returns double
+ * Subroutine: igets (hstring,keyword,lstr,str) returns character string
+ * Subroutine: igetc (hstring,keyword) returns character string
+ * Subroutine: isearch (hstring,keyword) returns pointer to header string entry
+ */
+
+#include <string.h> /* NULL, strlen, strstr, strcpy */
+#include <stdio.h>
+#include "fitshead.h" /* FITS header extraction subroutines */
+#include <stdlib.h>
+#ifndef VMS
+#include <limits.h>
+#else
+#define INT_MAX 2147483647 /* Biggest number that can fit in long */
+#define SHRT_MAX 32767
+#endif
+
+#define MAX_LVAL 2000
+
+static char *isearch();
+static char val[30];
+
+/* Extract long value for variable from IRAF multiline keyword value */
+
+int
+mgeti4 (hstring, mkey, keyword, ival)
+
+const char *hstring; /* Character string containing FITS or IRAF header information
+ in the format <keyword>= <value> ... */
+const char *mkey; /* Character string containing the name of the multi-line
+ keyword, the string value of which contains the desired
+ keyword, the value of which is returned. */
+const char *keyword; /* Character string containing the name of the keyword
+ within the multiline IRAF keyword */
+int *ival; /* Integer value returned */
+{
+ char *mstring;
+
+ mstring = malloc (MAX_LVAL);
+
+ if (hgetm (hstring, mkey, MAX_LVAL, mstring)) {
+ if (igeti4 (mstring, keyword, ival)) {
+ free (mstring);
+ return (1);
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+}
+
+/* Extract double value for variable from IRAF multiline keyword value */
+
+int
+mgetr8 (hstring, mkey, keyword, dval)
+
+const char *hstring; /* Character string containing FITS or IRAF header information
+ in the format <keyword>= <value> ... */
+const char *mkey; /* Character string containing the name of the multi-line
+ keyword, the string value of which contains the desired
+ keyword, the value of which is returned. */
+const char *keyword; /* Character string containing the name of the keyword
+ within the multiline IRAF keyword */
+double *dval; /* Integer value returned */
+{
+ char *mstring;
+ mstring = malloc (MAX_LVAL);
+
+ if (hgetm (hstring, mkey, MAX_LVAL, mstring)) {
+ if (igetr8 (mstring, keyword, dval)) {
+ free (mstring);
+ return (1);
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+}
+
+
+/* Extract string value for variable from IRAF keyword value string */
+
+int
+mgetstr (hstring, mkey, keyword, lstr, str)
+
+const char *hstring; /* character string containing FITS header information
+ in the format <keyword>= <value> {/ <comment>} */
+const char *mkey; /* Character string containing the name of the multi-line
+ keyword, the string value of which contains the desired
+ keyword, the value of which is returned. */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+const int lstr; /* Size of str in characters */
+char *str; /* String (returned) */
+{
+ char *mstring;
+ mstring = malloc (MAX_LVAL);
+
+ if (hgetm (hstring, mkey, MAX_LVAL, mstring)) {
+ if (igets (mstring, keyword, lstr, str)) {
+ free (mstring);
+ return (1);
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+ }
+ else {
+ free (mstring);
+ return (0);
+ }
+}
+
+
+/* Extract long value for variable from IRAF keyword value string */
+
+int
+igeti4 (hstring, keyword, ival)
+
+const char *hstring; /* character string containing IRAF header information
+ in the format <keyword>= <value> ... */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+int *ival; /* Integer value returned */
+{
+char *value;
+double dval;
+int minint;
+
+/* Get value from header string */
+ value = igetc (hstring,keyword);
+
+/* Translate value from ASCII to binary */
+ if (value != NULL) {
+ minint = -INT_MAX - 1;
+ strcpy (val, value);
+ dval = atof (val);
+ if (dval+0.001 > INT_MAX)
+ *ival = INT_MAX;
+ else if (dval >= 0)
+ *ival = (int) (dval + 0.001);
+ else if (dval-0.001 < minint)
+ *ival = minint;
+ else
+ *ival = (int) (dval - 0.001);
+ return (1);
+ }
+ else {
+ return (0);
+ }
+}
+
+
+/* Extract integer*2 value for variable from IRAF keyword value string */
+
+int
+igeti2 (hstring,keyword,ival)
+
+const char *hstring; /* character string containing FITS header information
+ in the format <keyword>= <value> {/ <comment>} */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+short *ival;
+{
+char *value;
+double dval;
+int minshort;
+
+/* Get value from header string */
+ value = igetc (hstring,keyword);
+
+/* Translate value from ASCII to binary */
+ if (value != NULL) {
+ strcpy (val, value);
+ dval = atof (val);
+ minshort = -SHRT_MAX - 1;
+ if (dval+0.001 > SHRT_MAX)
+ *ival = SHRT_MAX;
+ else if (dval >= 0)
+ *ival = (short) (dval + 0.001);
+ else if (dval-0.001 < minshort)
+ *ival = minshort;
+ else
+ *ival = (short) (dval - 0.001);
+ return (1);
+ }
+ else {
+ return (0);
+ }
+}
+
+/* Extract real value for variable from IRAF keyword value string */
+
+int
+igetr4 (hstring,keyword,rval)
+
+const char *hstring; /* character string containing FITS header information
+ in the format <keyword>= <value> {/ <comment>} */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+float *rval;
+{
+ char *value;
+
+/* Get value from header string */
+ value = igetc (hstring,keyword);
+
+/* Translate value from ASCII to binary */
+ if (value != NULL) {
+ strcpy (val, value);
+ *rval = (float) atof (val);
+ return (1);
+ }
+ else {
+ return (0);
+ }
+}
+
+
+/* Extract real*8 value for variable from IRAF keyword value string */
+
+int
+igetr8 (hstring,keyword,dval)
+
+const char *hstring; /* character string containing FITS header information
+ in the format <keyword>= <value> {/ <comment>} */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+double *dval;
+{
+ char *value,val[30];
+
+/* Get value from header string */
+ value = igetc (hstring,keyword);
+
+/* Translate value from ASCII to binary */
+ if (value != NULL) {
+ strcpy (val, value);
+ *dval = atof (val);
+ return (1);
+ }
+ else {
+ return (0);
+ }
+}
+
+
+/* Extract string value for variable from IRAF keyword value string */
+
+int
+igets (hstring, keyword, lstr, str)
+
+const char *hstring; /* character string containing FITS header information
+ in the format <keyword>= <value> {/ <comment>} */
+const char *keyword; /* character string containing the name of the keyword
+ the value of which is returned. hget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+const int lstr; /* Size of str in characters */
+char *str; /* String (returned) */
+{
+ char *value;
+ int lval;
+
+/* Get value from header string */
+ value = igetc (hstring,keyword);
+
+ if (value != NULL) {
+ lval = strlen (value);
+ if (lval < lstr)
+ strcpy (str, value);
+ else if (lstr > 1)
+ strncpy (str, value, lstr-1);
+ else
+ str[0] = value[0];
+ return (1);
+ }
+ else
+ return (0);
+}
+
+
+/* Extract character value for variable from IRAF keyword value string */
+
+char *
+igetc (hstring,keyword0)
+
+const char *hstring; /* character string containing IRAF keyword value string
+ in the format <keyword>= <value> {/ <comment>} */
+const char *keyword0; /* character string containing the name of the keyword
+ the value of which is returned. iget searches for a
+ line beginning with this string. if "[n]" is present,
+ the n'th token in the value is returned.
+ (the first 8 characters must be unique) */
+{
+ static char cval[MAX_LVAL];
+ char *value;
+ char cwhite[8];
+ char lbracket[2],rbracket[2];
+ char keyword[16];
+ char line[MAX_LVAL];
+ char *vpos,*cpar;
+ char *c1, *brack1, *brack2;
+ int ipar, i;
+
+ lbracket[0] = 91;
+ lbracket[1] = 0;
+ rbracket[0] = 93;
+ rbracket[1] = 0;
+
+/* Find length of variable name */
+ strcpy (keyword,keyword0);
+ brack1 = strsrch (keyword,lbracket);
+ if (brack1 != NULL) *brack1 = '\0';
+
+/* Search header string for variable name */
+ vpos = isearch (hstring,keyword);
+
+/* Exit if not found */
+ if (vpos == NULL) {
+ return (NULL);
+ }
+
+/* Initialize returned value to nulls */
+ for (i = 0; i < MAX_LVAL; i++)
+ line[i] = 0;
+
+/* If quoted value, copy until second quote is reached */
+ i = 0;
+ if (*vpos == '"') {
+ vpos++;
+ while (*vpos && *vpos != '"' && i < MAX_LVAL)
+ line[i++] = *vpos++;
+ }
+
+/* Otherwise copy until next space or tab */
+ else {
+ while (*vpos != ' ' && *vpos != (char)9 &&
+ *vpos > 0 && i < MAX_LVAL)
+ line[i++] = *vpos++;
+ }
+
+/* If keyword has brackets, extract appropriate token from value */
+ if (brack1 != NULL) {
+ c1 = (char *) (brack1 + 1);
+ brack2 = strsrch (c1, rbracket);
+ if (brack2 != NULL) {
+ *brack2 = '\0';
+ ipar = atoi (c1);
+ if (ipar > 0) {
+ cwhite[0] = ' ';
+ cwhite[1] = ',';
+ cwhite[2] = '\0';
+ cpar = strtok (line, cwhite);
+ for (i = 1; i < ipar; i++) {
+ cpar = strtok (NULL, cwhite);
+ }
+ if (cpar != NULL) {
+ strcpy (cval,cpar);
+ }
+ else
+ value = NULL;
+ }
+ }
+ }
+ else
+ strcpy (cval, line);
+
+ value = cval;
+
+ return (value);
+}
+
+
+/* Find value for specified IRAF keyword */
+
+static char *
+isearch (hstring,keyword)
+
+/* Find entry for keyword keyword in IRAF keyword value string hstring.
+ NULL is returned if the keyword is not found */
+
+const char *hstring; /* character string containing fits-style header
+ information in the format <keyword>= <value> {/ <comment>}
+ the default is that each entry is 80 characters long;
+ however, lines may be of arbitrary length terminated by
+ nulls, carriage returns or linefeeds, if packed is true. */
+const char *keyword; /* character string containing the name of the variable
+ to be returned. isearch searches for a line beginning
+ with this string. The string may be a character
+ literal or a character variable terminated by a null
+ or '$'. it is truncated to 8 characters. */
+{
+ char *loc, *headnext, *headlast, *pval;
+ int lastchar, nextchar, lkey, nleft, lhstr;
+
+/* Search header string for variable name */
+ lhstr = 0;
+ while (lhstr < 57600 && hstring[lhstr] != 0)
+ lhstr++;
+ headlast = (char *) hstring + lhstr;
+ headnext = (char *) hstring;
+ pval = NULL;
+ lkey = strlen (keyword);
+ while (headnext < headlast) {
+ nleft = headlast - headnext;
+ loc = strnsrch (headnext, keyword, nleft);
+
+ /* Exit if keyword is not found */
+ if (loc == NULL) {
+ break;
+ }
+
+ nextchar = (int) *(loc + lkey);
+ lastchar = (int) *(loc - 1);
+
+ /* If parameter name in header is longer, keep searching */
+ if (nextchar != 61 && nextchar > 32 && nextchar < 127)
+ headnext = loc + 1;
+
+ /* If start of string, keep it */
+ else if (loc == hstring) {
+ pval = loc;
+ break;
+ }
+
+ /* If preceeded by a blank or tab, keep it */
+ else if (lastchar == 32 || lastchar == 9) {
+ pval = loc;
+ break;
+ }
+
+ else
+ headnext = loc + 1;
+ }
+
+ /* Find start of value string for this keyword */
+ if (pval != NULL) {
+ pval = pval + lkey;
+ while (*pval == ' ' || *pval == '=')
+ pval++;
+ }
+
+ /* Return pointer to calling program */
+ return (pval);
+
+}
+
+/* Mar 12 1998 New subroutines
+ * Apr 15 1998 Set IGET() and ISEARCH() static when defined
+ * Apr 24 1998 Add MGETI4(), MGETR8(), and MGETS() for single step IRAF ext.
+ * Jun 1 1998 Add VMS patch from Harry Payne at STScI
+ * Jul 9 1998 Fix bracket token extraction after Paul Sydney
+
+ * May 5 1999 values.h -> POSIX limits.h: MAXINT->INT_MAX, MAXSHORT->SHRT_MAX
+ * Oct 21 1999 Fix declarations after lint
+ *
+ * Feb 11 2000 Stop search for end of quoted keyword if more than 500 chars
+ * Jul 20 2000 Drop unused variables squot, dquot, and slash in igetc()
+ *
+ * Jun 26 2002 Change maximum string length from 600 to 2000; use MAX_LVAL
+ * Jun 26 2002 Stop search for end of quoted keyword if > MAX_LVAL chars
+ *
+ * Sep 23 2003 Change mgets() to mgetstr() to avoid name collision at UCO Lick
+ *
+ * Feb 26 2004 Make igetc() accessible from outside this file
+ *
+ * Jan 4 2007 Declare header, keyword to be const
+ */