Blame


1 cd5bae78 2004-04-21 devnull #include "astro.h"
2 cd5bae78 2004-04-21 devnull
3 cd5bae78 2004-04-21 devnull
4 cd5bae78 2004-04-21 devnull char* month[] =
5 cd5bae78 2004-04-21 devnull {
6 cd5bae78 2004-04-21 devnull "January",
7 cd5bae78 2004-04-21 devnull "February",
8 cd5bae78 2004-04-21 devnull "March",
9 cd5bae78 2004-04-21 devnull "April",
10 cd5bae78 2004-04-21 devnull "May",
11 cd5bae78 2004-04-21 devnull "June",
12 cd5bae78 2004-04-21 devnull "July",
13 cd5bae78 2004-04-21 devnull "August",
14 cd5bae78 2004-04-21 devnull "September",
15 cd5bae78 2004-04-21 devnull "October",
16 cd5bae78 2004-04-21 devnull "November",
17 cbeb0b26 2006-04-01 devnull "December"
18 cd5bae78 2004-04-21 devnull };
19 cd5bae78 2004-04-21 devnull
20 cd5bae78 2004-04-21 devnull double
21 cd5bae78 2004-04-21 devnull dsrc(double d, Tim *t, int i)
22 cd5bae78 2004-04-21 devnull {
23 cd5bae78 2004-04-21 devnull double y;
24 cd5bae78 2004-04-21 devnull
25 cd5bae78 2004-04-21 devnull do {
26 cd5bae78 2004-04-21 devnull t->ifa[i] += 1.;
27 cd5bae78 2004-04-21 devnull y = convdate(t);
28 cd5bae78 2004-04-21 devnull } while(d >= y);
29 cd5bae78 2004-04-21 devnull do {
30 cd5bae78 2004-04-21 devnull t->ifa[i] -= 1.;
31 cd5bae78 2004-04-21 devnull y = convdate(t);
32 cd5bae78 2004-04-21 devnull } while(d < y);
33 cd5bae78 2004-04-21 devnull return d - y;
34 cd5bae78 2004-04-21 devnull }
35 cd5bae78 2004-04-21 devnull
36 cd5bae78 2004-04-21 devnull void
37 cd5bae78 2004-04-21 devnull dtsetup(double d, Tim *t)
38 cd5bae78 2004-04-21 devnull {
39 cd5bae78 2004-04-21 devnull double v;
40 cd5bae78 2004-04-21 devnull
41 cd5bae78 2004-04-21 devnull t->ifa[0] = floor(1900 + d/365.24220);
42 cd5bae78 2004-04-21 devnull t->ifa[1] = 1;
43 cd5bae78 2004-04-21 devnull t->ifa[2] = 1;
44 cd5bae78 2004-04-21 devnull t->ifa[3] = 0;
45 cd5bae78 2004-04-21 devnull t->ifa[4] = 0;
46 cd5bae78 2004-04-21 devnull t->ifa[1] = floor(1 + dsrc(d, t, 0)/30);
47 cd5bae78 2004-04-21 devnull t->ifa[2] = floor(1 + dsrc(d, t, 1));
48 cd5bae78 2004-04-21 devnull dsrc(d, t, 2);
49 cd5bae78 2004-04-21 devnull
50 cd5bae78 2004-04-21 devnull v = (d - convdate(t)) * 24;
51 cd5bae78 2004-04-21 devnull t->ifa[3] = floor(v);
52 cd5bae78 2004-04-21 devnull t->ifa[4] = (v - t->ifa[3]) * 60;
53 cd5bae78 2004-04-21 devnull convdate(t); /* to set timezone */
54 cd5bae78 2004-04-21 devnull }
55 cd5bae78 2004-04-21 devnull
56 cd5bae78 2004-04-21 devnull void
57 cd5bae78 2004-04-21 devnull pdate(double d)
58 cd5bae78 2004-04-21 devnull {
59 cd5bae78 2004-04-21 devnull int i;
60 cd5bae78 2004-04-21 devnull Tim t;
61 cd5bae78 2004-04-21 devnull
62 cd5bae78 2004-04-21 devnull dtsetup(d, &t);
63 cd5bae78 2004-04-21 devnull if(flags['s']) {
64 cd5bae78 2004-04-21 devnull i = t.ifa[1];
65 cd5bae78 2004-04-21 devnull print("%s ", month[i-1]);
66 cd5bae78 2004-04-21 devnull i = t.ifa[2];
67 cd5bae78 2004-04-21 devnull numb(i);
68 cd5bae78 2004-04-21 devnull print("...");
69 cd5bae78 2004-04-21 devnull return;
70 cd5bae78 2004-04-21 devnull }
71 cd5bae78 2004-04-21 devnull
72 cd5bae78 2004-04-21 devnull /* year month day */
73 cd5bae78 2004-04-21 devnull print("%4d %2d %2d",
74 cd5bae78 2004-04-21 devnull (int)t.ifa[0],
75 cd5bae78 2004-04-21 devnull (int)t.ifa[1],
76 cd5bae78 2004-04-21 devnull (int)t.ifa[2]);
77 cd5bae78 2004-04-21 devnull }
78 cd5bae78 2004-04-21 devnull
79 cd5bae78 2004-04-21 devnull void
80 cd5bae78 2004-04-21 devnull ptime(double d)
81 cd5bae78 2004-04-21 devnull {
82 cd5bae78 2004-04-21 devnull int h, m, s;
83 cd5bae78 2004-04-21 devnull char *mer;
84 cd5bae78 2004-04-21 devnull Tim t;
85 cd5bae78 2004-04-21 devnull
86 cd5bae78 2004-04-21 devnull if(flags['s']) {
87 cd5bae78 2004-04-21 devnull /* hour minute */
88 cd5bae78 2004-04-21 devnull dtsetup(d + .5/(24*60), &t);
89 cd5bae78 2004-04-21 devnull h = t.ifa[3];
90 cd5bae78 2004-04-21 devnull m = floor(t.ifa[4]);
91 cd5bae78 2004-04-21 devnull
92 cd5bae78 2004-04-21 devnull mer = "AM";
93 cd5bae78 2004-04-21 devnull if(h >= 12) {
94 cd5bae78 2004-04-21 devnull mer = "PM";
95 cd5bae78 2004-04-21 devnull h -= 12;
96 cd5bae78 2004-04-21 devnull }
97 cd5bae78 2004-04-21 devnull if(h == 0)
98 cd5bae78 2004-04-21 devnull h = 12;
99 cd5bae78 2004-04-21 devnull numb(h);
100 cd5bae78 2004-04-21 devnull if(m < 10) {
101 cd5bae78 2004-04-21 devnull if(m == 0) {
102 cd5bae78 2004-04-21 devnull print("%s exactly ...", mer);
103 cd5bae78 2004-04-21 devnull return;
104 cd5bae78 2004-04-21 devnull }
105 cd5bae78 2004-04-21 devnull print("O ");
106 cd5bae78 2004-04-21 devnull }
107 cd5bae78 2004-04-21 devnull numb(m);
108 cd5bae78 2004-04-21 devnull print("%s ...", mer);
109 cd5bae78 2004-04-21 devnull return;
110 cd5bae78 2004-04-21 devnull }
111 cd5bae78 2004-04-21 devnull /* hour minute second */
112 cd5bae78 2004-04-21 devnull dtsetup(d, &t);
113 cd5bae78 2004-04-21 devnull h = t.ifa[3];
114 cd5bae78 2004-04-21 devnull m = floor(t.ifa[4]);
115 cd5bae78 2004-04-21 devnull s = floor((t.ifa[4]-m) * 60);
116 cd5bae78 2004-04-21 devnull print("%.2d:%.2d:%.2d %.*s", h, m, s, utfnlen(t.tz, 3), t.tz);
117 cd5bae78 2004-04-21 devnull }
118 cd5bae78 2004-04-21 devnull
119 cd5bae78 2004-04-21 devnull char* unit[] =
120 cd5bae78 2004-04-21 devnull {
121 cd5bae78 2004-04-21 devnull "zero",
122 cd5bae78 2004-04-21 devnull "one",
123 cd5bae78 2004-04-21 devnull "two",
124 cd5bae78 2004-04-21 devnull "three",
125 cd5bae78 2004-04-21 devnull "four",
126 cd5bae78 2004-04-21 devnull "five",
127 cd5bae78 2004-04-21 devnull "six",
128 cd5bae78 2004-04-21 devnull "seven",
129 cd5bae78 2004-04-21 devnull "eight",
130 cd5bae78 2004-04-21 devnull "nine",
131 cd5bae78 2004-04-21 devnull "ten",
132 cd5bae78 2004-04-21 devnull "eleven",
133 cd5bae78 2004-04-21 devnull "twelve",
134 cd5bae78 2004-04-21 devnull "thirteen",
135 cd5bae78 2004-04-21 devnull "fourteen",
136 cd5bae78 2004-04-21 devnull "fifteen",
137 cd5bae78 2004-04-21 devnull "sixteen",
138 cd5bae78 2004-04-21 devnull "seventeen",
139 cd5bae78 2004-04-21 devnull "eighteen",
140 cd5bae78 2004-04-21 devnull "nineteen"
141 cd5bae78 2004-04-21 devnull };
142 cd5bae78 2004-04-21 devnull char* decade[] =
143 cd5bae78 2004-04-21 devnull {
144 cd5bae78 2004-04-21 devnull "twenty",
145 cd5bae78 2004-04-21 devnull "thirty",
146 cd5bae78 2004-04-21 devnull "forty",
147 cd5bae78 2004-04-21 devnull "fifty",
148 cd5bae78 2004-04-21 devnull "sixty",
149 cd5bae78 2004-04-21 devnull "seventy",
150 cd5bae78 2004-04-21 devnull "eighty",
151 cd5bae78 2004-04-21 devnull "ninety"
152 cd5bae78 2004-04-21 devnull };
153 cd5bae78 2004-04-21 devnull
154 cd5bae78 2004-04-21 devnull void
155 cd5bae78 2004-04-21 devnull pstime(double d)
156 cd5bae78 2004-04-21 devnull {
157 cd5bae78 2004-04-21 devnull
158 cd5bae78 2004-04-21 devnull setime(d);
159 cd5bae78 2004-04-21 devnull
160 cd5bae78 2004-04-21 devnull semi = 0;
161 cd5bae78 2004-04-21 devnull motion = 0;
162 cd5bae78 2004-04-21 devnull rad = 1.e9;
163 cd5bae78 2004-04-21 devnull lambda = 0;
164 cd5bae78 2004-04-21 devnull beta = 0;
165 cd5bae78 2004-04-21 devnull
166 cbeb0b26 2006-04-01 devnull /* uses lambda, beta, rad, motion */
167 cbeb0b26 2006-04-01 devnull /* sets alpha, delta, rp */
168 cd5bae78 2004-04-21 devnull
169 cd5bae78 2004-04-21 devnull helio();
170 cd5bae78 2004-04-21 devnull
171 cbeb0b26 2006-04-01 devnull /* uses alpha, delta, rp */
172 cbeb0b26 2006-04-01 devnull /* sets ra, decl, lha, decl2, az, el */
173 cd5bae78 2004-04-21 devnull
174 cd5bae78 2004-04-21 devnull geo();
175 cd5bae78 2004-04-21 devnull
176 cd5bae78 2004-04-21 devnull print(" %R %D %D %4.0f", lha, nlat, awlong, elev/3.28084);
177 cd5bae78 2004-04-21 devnull }
178 cd5bae78 2004-04-21 devnull
179 cd5bae78 2004-04-21 devnull void
180 cd5bae78 2004-04-21 devnull numb(int n)
181 cd5bae78 2004-04-21 devnull {
182 cd5bae78 2004-04-21 devnull
183 cd5bae78 2004-04-21 devnull if(n >= 100) {
184 cd5bae78 2004-04-21 devnull print("%d ", n);
185 cd5bae78 2004-04-21 devnull return;
186 cd5bae78 2004-04-21 devnull }
187 cd5bae78 2004-04-21 devnull if(n >= 20) {
188 cd5bae78 2004-04-21 devnull print("%s ", decade[n/10 - 2]);
189 cd5bae78 2004-04-21 devnull n %= 10;
190 cd5bae78 2004-04-21 devnull if(n == 0)
191 cd5bae78 2004-04-21 devnull return;
192 cd5bae78 2004-04-21 devnull }
193 cd5bae78 2004-04-21 devnull print("%s ", unit[n]);
194 cd5bae78 2004-04-21 devnull }
195 cd5bae78 2004-04-21 devnull
196 cd5bae78 2004-04-21 devnull double
197 cd5bae78 2004-04-21 devnull tzone(double y, Tim *z)
198 cd5bae78 2004-04-21 devnull {
199 cd5bae78 2004-04-21 devnull double t, l1, l2;
200 cd5bae78 2004-04-21 devnull Tm t1, t2;
201 cd5bae78 2004-04-21 devnull
202 cd5bae78 2004-04-21 devnull /*
203 cd5bae78 2004-04-21 devnull * get a rough approximation to unix mean time
204 cd5bae78 2004-04-21 devnull */
205 cd5bae78 2004-04-21 devnull t = (y - 25567.5) * 86400;
206 cd5bae78 2004-04-21 devnull
207 cd5bae78 2004-04-21 devnull /*
208 cd5bae78 2004-04-21 devnull * if outside unix conversions,
209 cd5bae78 2004-04-21 devnull * just call it GMT
210 cd5bae78 2004-04-21 devnull */
211 cd5bae78 2004-04-21 devnull if(t < 0 || t > 2.1e9)
212 cd5bae78 2004-04-21 devnull return y;
213 cd5bae78 2004-04-21 devnull
214 cd5bae78 2004-04-21 devnull /*
215 cd5bae78 2004-04-21 devnull * convert by both local and gmt
216 cd5bae78 2004-04-21 devnull */
217 cd5bae78 2004-04-21 devnull t1 = *localtime((long)t);
218 cd5bae78 2004-04-21 devnull t2 = *gmtime((long)t);
219 cd5bae78 2004-04-21 devnull
220 cd5bae78 2004-04-21 devnull /*
221 cd5bae78 2004-04-21 devnull * pick up year crossings
222 cd5bae78 2004-04-21 devnull */
223 cd5bae78 2004-04-21 devnull if(t1.yday == 0 && t2.yday > 1)
224 cd5bae78 2004-04-21 devnull t1.yday = t2.yday+1;
225 cd5bae78 2004-04-21 devnull if(t2.yday == 0 && t1.yday > 1)
226 cd5bae78 2004-04-21 devnull t2.yday = t1.yday+1;
227 cd5bae78 2004-04-21 devnull
228 cd5bae78 2004-04-21 devnull /*
229 cd5bae78 2004-04-21 devnull * convert times to days
230 cd5bae78 2004-04-21 devnull */
231 cd5bae78 2004-04-21 devnull l1 = t1.yday + t1.hour/24. + t1.min/1440. + t1.sec/86400.;
232 cd5bae78 2004-04-21 devnull l2 = t2.yday + t2.hour/24. + t2.min/1440. + t2.sec/86400.;
233 cd5bae78 2004-04-21 devnull
234 cd5bae78 2004-04-21 devnull /*
235 cd5bae78 2004-04-21 devnull * return difference
236 cd5bae78 2004-04-21 devnull */
237 cd5bae78 2004-04-21 devnull strncpy(z->tz, t1.zone, sizeof(z->tz));
238 cd5bae78 2004-04-21 devnull return y + (l2 - l1);
239 cd5bae78 2004-04-21 devnull }
240 cd5bae78 2004-04-21 devnull
241 cd5bae78 2004-04-21 devnull int dmo[12] =
242 cd5bae78 2004-04-21 devnull {
243 cd5bae78 2004-04-21 devnull 0,
244 cd5bae78 2004-04-21 devnull 31,
245 cd5bae78 2004-04-21 devnull 59,
246 cd5bae78 2004-04-21 devnull 90,
247 cd5bae78 2004-04-21 devnull 120,
248 cd5bae78 2004-04-21 devnull 151,
249 cd5bae78 2004-04-21 devnull 181,
250 cd5bae78 2004-04-21 devnull 212,
251 cd5bae78 2004-04-21 devnull 243,
252 cd5bae78 2004-04-21 devnull 273,
253 cd5bae78 2004-04-21 devnull 304,
254 cd5bae78 2004-04-21 devnull 334
255 cd5bae78 2004-04-21 devnull };
256 cd5bae78 2004-04-21 devnull
257 cd5bae78 2004-04-21 devnull /*
258 cd5bae78 2004-04-21 devnull * input date conversion
259 cd5bae78 2004-04-21 devnull * output is done by zero crossing
260 cd5bae78 2004-04-21 devnull * on this input conversion.
261 cd5bae78 2004-04-21 devnull */
262 cd5bae78 2004-04-21 devnull double
263 cd5bae78 2004-04-21 devnull convdate(Tim *t)
264 cd5bae78 2004-04-21 devnull {
265 cd5bae78 2004-04-21 devnull double y, d;
266 cd5bae78 2004-04-21 devnull int m;
267 cd5bae78 2004-04-21 devnull
268 cd5bae78 2004-04-21 devnull y = t->ifa[0];
269 cd5bae78 2004-04-21 devnull m = t->ifa[1];
270 cd5bae78 2004-04-21 devnull d = t->ifa[2];
271 cd5bae78 2004-04-21 devnull
272 cd5bae78 2004-04-21 devnull /*
273 cd5bae78 2004-04-21 devnull * normalize the month
274 cd5bae78 2004-04-21 devnull */
275 cd5bae78 2004-04-21 devnull while(m < 1) {
276 cd5bae78 2004-04-21 devnull m += 12;
277 cd5bae78 2004-04-21 devnull y -= 1;
278 cd5bae78 2004-04-21 devnull }
279 cd5bae78 2004-04-21 devnull while(m > 12) {
280 cd5bae78 2004-04-21 devnull m -= 12;
281 cd5bae78 2004-04-21 devnull y += 1;
282 cd5bae78 2004-04-21 devnull }
283 cd5bae78 2004-04-21 devnull
284 cd5bae78 2004-04-21 devnull /*
285 cd5bae78 2004-04-21 devnull * bc correction
286 cd5bae78 2004-04-21 devnull */
287 cd5bae78 2004-04-21 devnull if(y < 0)
288 cd5bae78 2004-04-21 devnull y += 1;
289 cd5bae78 2004-04-21 devnull
290 cd5bae78 2004-04-21 devnull /*
291 cd5bae78 2004-04-21 devnull * normal conversion
292 cd5bae78 2004-04-21 devnull */
293 cd5bae78 2004-04-21 devnull y += 4712;
294 cd5bae78 2004-04-21 devnull if(fmod(y, 4) == 0 && m > 2)
295 cd5bae78 2004-04-21 devnull d += 1;
296 cd5bae78 2004-04-21 devnull y = y*365 + floor((y+3)/4) + dmo[m-1] + d - 1;
297 cd5bae78 2004-04-21 devnull
298 cd5bae78 2004-04-21 devnull /*
299 cd5bae78 2004-04-21 devnull * gregorian change
300 cd5bae78 2004-04-21 devnull */
301 cd5bae78 2004-04-21 devnull if(y > 2361232)
302 cd5bae78 2004-04-21 devnull y -= floor((y-1794167)/36524.220) -
303 cd5bae78 2004-04-21 devnull floor((y-1721117)/146100);
304 cd5bae78 2004-04-21 devnull y += t->ifa[3]/24 + t->ifa[4]/1440 - 2415020.5;
305 cd5bae78 2004-04-21 devnull
306 cd5bae78 2004-04-21 devnull /*
307 cd5bae78 2004-04-21 devnull * kitchen clock correction
308 cd5bae78 2004-04-21 devnull */
309 cd5bae78 2004-04-21 devnull strncpy(t->tz, "GMT", sizeof(t->tz));
310 cd5bae78 2004-04-21 devnull if(flags['k'])
311 cd5bae78 2004-04-21 devnull y = tzone(y, t);
312 cd5bae78 2004-04-21 devnull return y;
313 cd5bae78 2004-04-21 devnull }