1 /* This file, scalnull.c, contains the FITSIO routines used to define */
2 /* the starting heap address, the value scaling and the null values. */
3
4 /* The FITSIO software was written by William Pence at the High Energy */
5 /* Astrophysic Science Archive Research Center (HEASARC) at the NASA */
6 /* Goddard Space Flight Center. */
7
8 #include <string.h>
9 #include "fitsio2.h"
10 /*--------------------------------------------------------------------------*/
ffpthp(fitsfile * fptr,long theap,int * status)11 int ffpthp(fitsfile *fptr, /* I - FITS file pointer */
12 long theap, /* I - starting addrss for the heap */
13 int *status) /* IO - error status */
14 /*
15 Define the starting address for the heap for a binary table.
16 The default address is NAXIS1 * NAXIS2. It is in units of
17 bytes relative to the beginning of the regular binary table data.
18 This routine also writes the appropriate THEAP keyword to the
19 FITS header.
20 */
21 {
22 if (*status > 0 || theap < 1)
23 return(*status);
24
25 /* reset position to the correct HDU if necessary */
26 if (fptr->HDUposition != (fptr->Fptr)->curhdu)
27 ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status);
28
29 (fptr->Fptr)->heapstart = theap;
30
31 ffukyj(fptr, "THEAP", theap, "byte offset to heap area", status);
32
33 return(*status);
34 }
35 /*--------------------------------------------------------------------------*/
ffpscl(fitsfile * fptr,double scale,double zero,int * status)36 int ffpscl(fitsfile *fptr, /* I - FITS file pointer */
37 double scale, /* I - scaling factor: value of BSCALE */
38 double zero, /* I - zero point: value of BZERO */
39 int *status) /* IO - error status */
40 /*
41 Define the linear scaling factor for the primary array or image extension
42 pixel values. This routine overrides the scaling values given by the
43 BSCALE and BZERO keywords if present. Note that this routine does not
44 write or modify the BSCALE and BZERO keywords, but instead only modifies
45 the values temporarily in the internal buffer. Thus, a subsequent call to
46 the ffrdef routine will reset the scaling back to the BSCALE and BZERO
47 keyword values (or 1. and 0. respectively if the keywords are not present).
48 */
49 {
50 tcolumn *colptr;
51 int hdutype;
52
53 if (*status > 0)
54 return(*status);
55
56 if (scale == 0)
57 return(*status = ZERO_SCALE); /* zero scale value is illegal */
58
59 if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
60 return(*status);
61
62 if (hdutype != IMAGE_HDU)
63 return(*status = NOT_IMAGE); /* not proper HDU type */
64
65 if (fits_is_compressed_image(fptr, status)) /* compressed images */
66 {
67 (fptr->Fptr)->cn_bscale = scale;
68 (fptr->Fptr)->cn_bzero = zero;
69 return(*status);
70 }
71
72 /* set pointer to the first 'column' (contains group parameters if any) */
73 colptr = (fptr->Fptr)->tableptr;
74
75 colptr++; /* increment to the 2nd 'column' pointer (the image itself) */
76
77 colptr->tscale = scale;
78 colptr->tzero = zero;
79
80 return(*status);
81 }
82 /*--------------------------------------------------------------------------*/
ffpnul(fitsfile * fptr,LONGLONG nulvalue,int * status)83 int ffpnul(fitsfile *fptr, /* I - FITS file pointer */
84 LONGLONG nulvalue, /* I - null pixel value: value of BLANK */
85 int *status) /* IO - error status */
86 /*
87 Define the value used to represent undefined pixels in the primary array or
88 image extension. This only applies to integer image pixel (i.e. BITPIX > 0).
89 This routine overrides the null pixel value given by the BLANK keyword
90 if present. Note that this routine does not write or modify the BLANK
91 keyword, but instead only modifies the value temporarily in the internal
92 buffer. Thus, a subsequent call to the ffrdef routine will reset the null
93 value back to the BLANK keyword value (or not defined if the keyword is not
94 present).
95 */
96 {
97 tcolumn *colptr;
98 int hdutype;
99
100 if (*status > 0)
101 return(*status);
102
103 if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
104 return(*status);
105
106 if (hdutype != IMAGE_HDU)
107 return(*status = NOT_IMAGE); /* not proper HDU type */
108
109 if (fits_is_compressed_image(fptr, status)) /* ignore compressed images */
110 return(*status);
111
112 /* set pointer to the first 'column' (contains group parameters if any) */
113 colptr = (fptr->Fptr)->tableptr;
114
115 colptr++; /* increment to the 2nd 'column' pointer (the image itself) */
116
117 colptr->tnull = nulvalue;
118
119 return(*status);
120 }
121 /*--------------------------------------------------------------------------*/
fftscl(fitsfile * fptr,int colnum,double scale,double zero,int * status)122 int fftscl(fitsfile *fptr, /* I - FITS file pointer */
123 int colnum, /* I - column number to apply scaling to */
124 double scale, /* I - scaling factor: value of TSCALn */
125 double zero, /* I - zero point: value of TZEROn */
126 int *status) /* IO - error status */
127 /*
128 Define the linear scaling factor for the TABLE or BINTABLE extension
129 column values. This routine overrides the scaling values given by the
130 TSCALn and TZEROn keywords if present. Note that this routine does not
131 write or modify the TSCALn and TZEROn keywords, but instead only modifies
132 the values temporarily in the internal buffer. Thus, a subsequent call to
133 the ffrdef routine will reset the scaling back to the TSCALn and TZEROn
134 keyword values (or 1. and 0. respectively if the keywords are not present).
135 */
136 {
137 tcolumn *colptr;
138 int hdutype;
139
140 if (*status > 0)
141 return(*status);
142
143 if (scale == 0)
144 return(*status = ZERO_SCALE); /* zero scale value is illegal */
145
146 if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
147 return(*status);
148
149 if (hdutype == IMAGE_HDU)
150 return(*status = NOT_TABLE); /* not proper HDU type */
151
152 colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
153 colptr += (colnum - 1); /* increment to the correct column */
154
155 colptr->tscale = scale;
156 colptr->tzero = zero;
157
158 return(*status);
159 }
160 /*--------------------------------------------------------------------------*/
fftnul(fitsfile * fptr,int colnum,LONGLONG nulvalue,int * status)161 int fftnul(fitsfile *fptr, /* I - FITS file pointer */
162 int colnum, /* I - column number to apply nulvalue to */
163 LONGLONG nulvalue, /* I - null pixel value: value of TNULLn */
164 int *status) /* IO - error status */
165 /*
166 Define the value used to represent undefined pixels in the BINTABLE column.
167 This only applies to integer datatype columns (TFORM = B, I, or J).
168 This routine overrides the null pixel value given by the TNULLn keyword
169 if present. Note that this routine does not write or modify the TNULLn
170 keyword, but instead only modifies the value temporarily in the internal
171 buffer. Thus, a subsequent call to the ffrdef routine will reset the null
172 value back to the TNULLn keyword value (or not defined if the keyword is not
173 present).
174 */
175 {
176 tcolumn *colptr;
177 int hdutype;
178
179 if (*status > 0)
180 return(*status);
181
182 if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
183 return(*status);
184
185 if (hdutype != BINARY_TBL)
186 return(*status = NOT_BTABLE); /* not proper HDU type */
187
188 colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
189 colptr += (colnum - 1); /* increment to the correct column */
190
191 colptr->tnull = nulvalue;
192
193 return(*status);
194 }
195 /*--------------------------------------------------------------------------*/
ffsnul(fitsfile * fptr,int colnum,char * nulstring,int * status)196 int ffsnul(fitsfile *fptr, /* I - FITS file pointer */
197 int colnum, /* I - column number to apply nulvalue to */
198 char *nulstring, /* I - null pixel value: value of TNULLn */
199 int *status) /* IO - error status */
200 /*
201 Define the string used to represent undefined pixels in the ASCII TABLE
202 column. This routine overrides the null value given by the TNULLn keyword
203 if present. Note that this routine does not write or modify the TNULLn
204 keyword, but instead only modifies the value temporarily in the internal
205 buffer. Thus, a subsequent call to the ffrdef routine will reset the null
206 value back to the TNULLn keyword value (or not defined if the keyword is not
207 present).
208 */
209 {
210 tcolumn *colptr;
211 int hdutype;
212
213 if (*status > 0)
214 return(*status);
215
216 if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
217 return(*status);
218
219 if (hdutype != ASCII_TBL)
220 return(*status = NOT_ATABLE); /* not proper HDU type */
221
222 colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
223 colptr += (colnum - 1); /* increment to the correct column */
224
225 colptr->strnull[0] = '\0';
226 strncat(colptr->strnull, nulstring, 19); /* limit string to 19 chars */
227
228 return(*status);
229 }
230