1 8a3b2ceb 2004-04-24 devnull #include <u.h>
2 8a3b2ceb 2004-04-24 devnull #include <libc.h>
3 8a3b2ceb 2004-04-24 devnull #include <bio.h>
4 8a3b2ceb 2004-04-24 devnull #include <draw.h>
5 8a3b2ceb 2004-04-24 devnull #include <event.h>
6 8a3b2ceb 2004-04-24 devnull #include "sky.h"
7 8a3b2ceb 2004-04-24 devnull #include "strings.c"
11 8a3b2ceb 2004-04-24 devnull NNGC=7840, /* number of NGC numbers [1..NNGC] */
12 8a3b2ceb 2004-04-24 devnull NIC = 5386, /* number of IC numbers */
13 8a3b2ceb 2004-04-24 devnull NNGCrec=NNGC+NIC, /* number of records in the NGC catalog (including IC's, starting at NNGC */
14 8a3b2ceb 2004-04-24 devnull NMrec=122, /* number of M records */
15 8a3b2ceb 2004-04-24 devnull NM=110, /* number of M numbers */
16 8a3b2ceb 2004-04-24 devnull NAbell=2712, /* number of records in the Abell catalog */
17 8a3b2ceb 2004-04-24 devnull NName=1000, /* number of prose names; estimated maximum (read from editable text file) */
18 8a3b2ceb 2004-04-24 devnull NBayer=1517, /* number of bayer entries */
19 8a3b2ceb 2004-04-24 devnull NSAO=258998, /* number of SAO stars */
20 8a3b2ceb 2004-04-24 devnull MAXcon=1932, /* maximum number of patches in a constellation */
21 8a3b2ceb 2004-04-24 devnull Ncon=88, /* number of constellations */
22 8a3b2ceb 2004-04-24 devnull Npatch=92053, /* highest patch number */
25 8a3b2ceb 2004-04-24 devnull char ngctype[NNGCrec];
26 8a3b2ceb 2004-04-24 devnull Mindexrec mindex[NMrec];
27 8a3b2ceb 2004-04-24 devnull Namerec name[NName];
28 8a3b2ceb 2004-04-24 devnull Bayerec bayer[NBayer];
29 8a3b2ceb 2004-04-24 devnull long con[MAXcon];
30 8a3b2ceb 2004-04-24 devnull ushort conindex[Ncon+1];
31 8a3b2ceb 2004-04-24 devnull long patchaddr[Npatch+1];
33 8a3b2ceb 2004-04-24 devnull Record *rec;
34 8a3b2ceb 2004-04-24 devnull Record *orec;
35 8a3b2ceb 2004-04-24 devnull Record *cur;
37 8a3b2ceb 2004-04-24 devnull char *dir;
38 8a3b2ceb 2004-04-24 devnull int saodb;
39 8a3b2ceb 2004-04-24 devnull int ngcdb;
40 8a3b2ceb 2004-04-24 devnull int abelldb;
41 8a3b2ceb 2004-04-24 devnull int ngctypedb;
42 8a3b2ceb 2004-04-24 devnull int mindexdb;
43 8a3b2ceb 2004-04-24 devnull int namedb;
44 8a3b2ceb 2004-04-24 devnull int bayerdb;
45 8a3b2ceb 2004-04-24 devnull int condb;
46 8a3b2ceb 2004-04-24 devnull int conindexdb;
47 8a3b2ceb 2004-04-24 devnull int patchdb;
48 8a3b2ceb 2004-04-24 devnull char parsed[3];
49 8a3b2ceb 2004-04-24 devnull long nrec;
50 8a3b2ceb 2004-04-24 devnull long nreca;
51 8a3b2ceb 2004-04-24 devnull long norec;
52 8a3b2ceb 2004-04-24 devnull long noreca;
54 8a3b2ceb 2004-04-24 devnull Biobuf bin;
55 8a3b2ceb 2004-04-24 devnull Biobuf bout;
58 8a3b2ceb 2004-04-24 devnull main(int argc, char *argv[])
60 8a3b2ceb 2004-04-24 devnull char *line;
62 8a3b2ceb 2004-04-24 devnull dir = unsharp(DIR);
63 8a3b2ceb 2004-04-24 devnull Binit(&bin, 0, OREAD);
64 8a3b2ceb 2004-04-24 devnull Binit(&bout, 1, OWRITE);
65 8a3b2ceb 2004-04-24 devnull if(argc != 1)
66 8a3b2ceb 2004-04-24 devnull dir = argv[1];
67 8a3b2ceb 2004-04-24 devnull astro("", 1);
68 8a3b2ceb 2004-04-24 devnull while(line = Brdline(&bin, '\n')){
69 8a3b2ceb 2004-04-24 devnull line[Blinelen(&bin)-1] = 0;
70 8a3b2ceb 2004-04-24 devnull lookup(line, 1);
71 8a3b2ceb 2004-04-24 devnull Bflush(&bout);
73 8a3b2ceb 2004-04-24 devnull if(display != nil){
74 8a3b2ceb 2004-04-24 devnull closedisplay(display);
75 8a3b2ceb 2004-04-24 devnull /* automatic refresh of rio window is triggered by mouse */
76 cbeb0b26 2006-04-01 devnull /* close(open("/dev/mouse", OREAD)); */
82 8a3b2ceb 2004-04-24 devnull reset(void)
84 8a3b2ceb 2004-04-24 devnull nrec = 0;
85 8a3b2ceb 2004-04-24 devnull cur = rec;
89 8a3b2ceb 2004-04-24 devnull grow(void)
92 8a3b2ceb 2004-04-24 devnull if(nreca < nrec){
93 8a3b2ceb 2004-04-24 devnull nreca = nrec+50;
94 8a3b2ceb 2004-04-24 devnull rec = realloc(rec, nreca*sizeof(Record));
95 8a3b2ceb 2004-04-24 devnull if(rec == 0){
96 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: realloc fails\n");
97 8a3b2ceb 2004-04-24 devnull exits("realloc");
100 8a3b2ceb 2004-04-24 devnull cur = rec+nrec-1;
104 8a3b2ceb 2004-04-24 devnull copy(void)
106 8a3b2ceb 2004-04-24 devnull if(noreca < nreca){
107 8a3b2ceb 2004-04-24 devnull noreca = nreca;
108 8a3b2ceb 2004-04-24 devnull orec = realloc(orec, nreca*sizeof(Record));
109 8a3b2ceb 2004-04-24 devnull if(orec == 0){
110 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: realloc fails\n");
111 8a3b2ceb 2004-04-24 devnull exits("realloc");
114 8a3b2ceb 2004-04-24 devnull memmove(orec, rec, nrec*sizeof(Record));
115 8a3b2ceb 2004-04-24 devnull norec = nrec;
119 8a3b2ceb 2004-04-24 devnull eopen(char *s)
121 8a3b2ceb 2004-04-24 devnull char buf[128];
124 8a3b2ceb 2004-04-24 devnull sprint(buf, "%s/%s.scat", dir, s);
125 8a3b2ceb 2004-04-24 devnull f = open(buf, 0);
126 8a3b2ceb 2004-04-24 devnull if(f<0){
127 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: can't open %s\n", buf);
128 8a3b2ceb 2004-04-24 devnull exits("open");
130 8a3b2ceb 2004-04-24 devnull return f;
135 8a3b2ceb 2004-04-24 devnull Eread(int f, char *name, void *addr, long n)
137 8a3b2ceb 2004-04-24 devnull if(read(f, addr, n) != n){ /* BUG! */
138 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: read error on %s\n", name);
139 8a3b2ceb 2004-04-24 devnull exits("read");
144 8a3b2ceb 2004-04-24 devnull skipbl(char *s)
146 8a3b2ceb 2004-04-24 devnull while(*s!=0 && (*s==' ' || *s=='\t'))
148 8a3b2ceb 2004-04-24 devnull return s;
152 8a3b2ceb 2004-04-24 devnull skipstr(char *s, char *t)
154 8a3b2ceb 2004-04-24 devnull while(*s && *s==*t)
155 8a3b2ceb 2004-04-24 devnull s++, t++;
156 8a3b2ceb 2004-04-24 devnull return skipbl(s);
159 8a3b2ceb 2004-04-24 devnull /* produce little-endian long at address l */
161 8a3b2ceb 2004-04-24 devnull Long(long *l)
163 8a3b2ceb 2004-04-24 devnull uchar *p;
165 8a3b2ceb 2004-04-24 devnull p = (uchar*)l;
166 8a3b2ceb 2004-04-24 devnull return (long)p[0]|((long)p[1]<<8)|((long)p[2]<<16)|((long)p[3]<<24);
169 8a3b2ceb 2004-04-24 devnull /* produce little-endian long at address l */
171 8a3b2ceb 2004-04-24 devnull Short(short *s)
173 8a3b2ceb 2004-04-24 devnull uchar *p;
175 8a3b2ceb 2004-04-24 devnull p = (uchar*)s;
176 8a3b2ceb 2004-04-24 devnull return p[0]|(p[1]<<8);
180 8a3b2ceb 2004-04-24 devnull nameopen(void)
182 8a3b2ceb 2004-04-24 devnull Biobuf b;
184 8a3b2ceb 2004-04-24 devnull char *l, *p;
186 8a3b2ceb 2004-04-24 devnull if(namedb == 0){
187 8a3b2ceb 2004-04-24 devnull namedb = eopen("name");
188 8a3b2ceb 2004-04-24 devnull Binit(&b, namedb, OREAD);
189 8a3b2ceb 2004-04-24 devnull for(i=0; i<NName; i++){
190 8a3b2ceb 2004-04-24 devnull l = Brdline(&b, '\n');
191 8a3b2ceb 2004-04-24 devnull if(l == 0)
193 8a3b2ceb 2004-04-24 devnull p = strchr(l, '\t');
194 8a3b2ceb 2004-04-24 devnull if(p == 0){
195 8a3b2ceb 2004-04-24 devnull Badformat:
196 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "warning: name.scat bad format; line %d\n", i+1);
199 8a3b2ceb 2004-04-24 devnull *p++ = 0;
200 8a3b2ceb 2004-04-24 devnull strcpy(name[i].name, l);
201 8a3b2ceb 2004-04-24 devnull if(strncmp(p, "ngc", 3) == 0)
202 8a3b2ceb 2004-04-24 devnull name[i].ngc = atoi(p+3);
203 8a3b2ceb 2004-04-24 devnull else if(strncmp(p, "ic", 2) == 0)
204 8a3b2ceb 2004-04-24 devnull name[i].ngc = atoi(p+2)+NNGC;
205 8a3b2ceb 2004-04-24 devnull else if(strncmp(p, "sao", 3) == 0)
206 8a3b2ceb 2004-04-24 devnull name[i].sao = atoi(p+3);
207 8a3b2ceb 2004-04-24 devnull else if(strncmp(p, "abell", 5) == 0)
208 8a3b2ceb 2004-04-24 devnull name[i].abell = atoi(p+5);
210 8a3b2ceb 2004-04-24 devnull goto Badformat;
212 8a3b2ceb 2004-04-24 devnull if(i == NName)
213 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "warning: too many names in name.scat (max %d); extra ignored\n", NName);
214 8a3b2ceb 2004-04-24 devnull close(namedb);
216 8a3b2ceb 2004-04-24 devnull bayerdb = eopen("bayer");
217 8a3b2ceb 2004-04-24 devnull Eread(bayerdb, "bayer", bayer, sizeof bayer);
218 8a3b2ceb 2004-04-24 devnull close(bayerdb);
219 8a3b2ceb 2004-04-24 devnull for(i=0; i<NBayer; i++)
220 8a3b2ceb 2004-04-24 devnull bayer[i].sao = Long(&bayer[i].sao);
225 8a3b2ceb 2004-04-24 devnull saoopen(void)
227 8a3b2ceb 2004-04-24 devnull if(saodb == 0){
228 8a3b2ceb 2004-04-24 devnull nameopen();
229 8a3b2ceb 2004-04-24 devnull saodb = eopen("sao");
234 8a3b2ceb 2004-04-24 devnull ngcopen(void)
236 8a3b2ceb 2004-04-24 devnull if(ngcdb == 0){
237 8a3b2ceb 2004-04-24 devnull nameopen();
238 8a3b2ceb 2004-04-24 devnull ngcdb = eopen("ngc2000");
239 8a3b2ceb 2004-04-24 devnull ngctypedb = eopen("ngc2000type");
240 8a3b2ceb 2004-04-24 devnull Eread(ngctypedb, "ngctype", ngctype, sizeof ngctype);
241 8a3b2ceb 2004-04-24 devnull close(ngctypedb);
246 8a3b2ceb 2004-04-24 devnull abellopen(void)
248 8a3b2ceb 2004-04-24 devnull /* nothing extra to do with abell: it's directly indexed by number */
249 8a3b2ceb 2004-04-24 devnull if(abelldb == 0)
250 8a3b2ceb 2004-04-24 devnull abelldb = eopen("abell");
254 8a3b2ceb 2004-04-24 devnull patchopen(void)
256 8a3b2ceb 2004-04-24 devnull Biobuf *b;
257 8a3b2ceb 2004-04-24 devnull long l, m;
258 8a3b2ceb 2004-04-24 devnull char buf[100];
260 8a3b2ceb 2004-04-24 devnull if(patchdb == 0){
261 8a3b2ceb 2004-04-24 devnull patchdb = eopen("patch");
262 8a3b2ceb 2004-04-24 devnull sprint(buf, "%s/patchindex.scat", dir);
263 8a3b2ceb 2004-04-24 devnull b = Bopen(buf, OREAD);
264 8a3b2ceb 2004-04-24 devnull if(b == 0){
265 8a3b2ceb 2004-04-24 devnull fprint(2, "can't open %s\n", buf);
266 8a3b2ceb 2004-04-24 devnull exits("open");
268 8a3b2ceb 2004-04-24 devnull for(m=0,l=0; l<=Npatch; l++)
269 8a3b2ceb 2004-04-24 devnull patchaddr[l] = m += Bgetc(b)*4;
270 8a3b2ceb 2004-04-24 devnull Bterm(b);
275 8a3b2ceb 2004-04-24 devnull mopen(void)
279 8a3b2ceb 2004-04-24 devnull if(mindexdb == 0){
280 8a3b2ceb 2004-04-24 devnull mindexdb = eopen("mindex");
281 8a3b2ceb 2004-04-24 devnull Eread(mindexdb, "mindex", mindex, sizeof mindex);
282 8a3b2ceb 2004-04-24 devnull close(mindexdb);
283 8a3b2ceb 2004-04-24 devnull for(i=0; i<NMrec; i++)
284 8a3b2ceb 2004-04-24 devnull mindex[i].ngc = Short(&mindex[i].ngc);
289 8a3b2ceb 2004-04-24 devnull constelopen(void)
293 8a3b2ceb 2004-04-24 devnull if(condb == 0){
294 8a3b2ceb 2004-04-24 devnull condb = eopen("con");
295 8a3b2ceb 2004-04-24 devnull conindexdb = eopen("conindex");
296 8a3b2ceb 2004-04-24 devnull Eread(conindexdb, "conindex", conindex, sizeof conindex);
297 8a3b2ceb 2004-04-24 devnull close(conindexdb);
298 8a3b2ceb 2004-04-24 devnull for(i=0; i<Ncon+1; i++)
299 8a3b2ceb 2004-04-24 devnull conindex[i] = Short((short*)&conindex[i]);
304 8a3b2ceb 2004-04-24 devnull lowercase(char *s)
306 8a3b2ceb 2004-04-24 devnull for(; *s; s++)
307 8a3b2ceb 2004-04-24 devnull if('A'<=*s && *s<='Z')
308 8a3b2ceb 2004-04-24 devnull *s += 'a'-'A';
312 8a3b2ceb 2004-04-24 devnull loadngc(long index)
314 8a3b2ceb 2004-04-24 devnull static int failed;
317 8a3b2ceb 2004-04-24 devnull ngcopen();
318 8a3b2ceb 2004-04-24 devnull j = (index-1)*sizeof(NGCrec);
320 8a3b2ceb 2004-04-24 devnull cur->type = NGC;
321 8a3b2ceb 2004-04-24 devnull cur->index = index;
322 8a3b2ceb 2004-04-24 devnull seek(ngcdb, j, 0);
323 8a3b2ceb 2004-04-24 devnull /* special case: NGC data may not be available */
324 e9ad8994 2005-05-01 devnull if(read(ngcdb, &cur->u.ngc, sizeof(NGCrec)) != sizeof(NGCrec)){
325 8a3b2ceb 2004-04-24 devnull if(!failed){
326 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: NGC database not available\n");
327 8a3b2ceb 2004-04-24 devnull failed++;
329 8a3b2ceb 2004-04-24 devnull cur->type = NONGC;
330 e9ad8994 2005-05-01 devnull cur->u.ngc.ngc = 0;
331 e9ad8994 2005-05-01 devnull cur->u.ngc.ra = 0;
332 e9ad8994 2005-05-01 devnull cur->u.ngc.dec = 0;
333 e9ad8994 2005-05-01 devnull cur->u.ngc.diam = 0;
334 e9ad8994 2005-05-01 devnull cur->u.ngc.mag = 0;
335 8a3b2ceb 2004-04-24 devnull return 0;
337 e9ad8994 2005-05-01 devnull cur->u.ngc.ngc = Short(&cur->u.ngc.ngc);
338 e9ad8994 2005-05-01 devnull cur->u.ngc.ra = Long(&cur->u.ngc.ra);
339 e9ad8994 2005-05-01 devnull cur->u.ngc.dec = Long(&cur->u.ngc.dec);
340 e9ad8994 2005-05-01 devnull cur->u.ngc.diam = Long(&cur->u.ngc.diam);
341 e9ad8994 2005-05-01 devnull cur->u.ngc.mag = Short(&cur->u.ngc.mag);
342 8a3b2ceb 2004-04-24 devnull return 1;
346 8a3b2ceb 2004-04-24 devnull loadabell(long index)
350 8a3b2ceb 2004-04-24 devnull abellopen();
351 8a3b2ceb 2004-04-24 devnull j = index-1;
353 8a3b2ceb 2004-04-24 devnull cur->type = Abell;
354 8a3b2ceb 2004-04-24 devnull cur->index = index;
355 8a3b2ceb 2004-04-24 devnull seek(abelldb, j*sizeof(Abellrec), 0);
356 e9ad8994 2005-05-01 devnull Eread(abelldb, "abell", &cur->u.abell, sizeof(Abellrec));
357 e9ad8994 2005-05-01 devnull cur->u.abell.abell = Short(&cur->u.abell.abell);
358 e9ad8994 2005-05-01 devnull if(cur->u.abell.abell != index){
359 8a3b2ceb 2004-04-24 devnull fprint(2, "bad format in abell catalog\n");
360 8a3b2ceb 2004-04-24 devnull exits("abell");
362 e9ad8994 2005-05-01 devnull cur->u.abell.ra = Long(&cur->u.abell.ra);
363 e9ad8994 2005-05-01 devnull cur->u.abell.dec = Long(&cur->u.abell.dec);
364 e9ad8994 2005-05-01 devnull cur->u.abell.glat = Long(&cur->u.abell.glat);
365 e9ad8994 2005-05-01 devnull cur->u.abell.glong = Long(&cur->u.abell.glong);
366 e9ad8994 2005-05-01 devnull cur->u.abell.rad = Long(&cur->u.abell.rad);
367 e9ad8994 2005-05-01 devnull cur->u.abell.mag10 = Short(&cur->u.abell.mag10);
368 e9ad8994 2005-05-01 devnull cur->u.abell.pop = Short(&cur->u.abell.pop);
369 e9ad8994 2005-05-01 devnull cur->u.abell.dist = Short(&cur->u.abell.dist);
370 8a3b2ceb 2004-04-24 devnull return 1;
374 8a3b2ceb 2004-04-24 devnull loadsao(int index)
376 8a3b2ceb 2004-04-24 devnull if(index<=0 || index>NSAO)
377 8a3b2ceb 2004-04-24 devnull return 0;
378 8a3b2ceb 2004-04-24 devnull saoopen();
380 8a3b2ceb 2004-04-24 devnull cur->type = SAO;
381 8a3b2ceb 2004-04-24 devnull cur->index = index;
382 8a3b2ceb 2004-04-24 devnull seek(saodb, (index-1)*sizeof(SAOrec), 0);
383 e9ad8994 2005-05-01 devnull Eread(saodb, "sao", &cur->u.sao, sizeof(SAOrec));
384 e9ad8994 2005-05-01 devnull cur->u.sao.ra = Long(&cur->u.sao.ra);
385 e9ad8994 2005-05-01 devnull cur->u.sao.dec = Long(&cur->u.sao.dec);
386 e9ad8994 2005-05-01 devnull cur->u.sao.dra = Long(&cur->u.sao.dra);
387 e9ad8994 2005-05-01 devnull cur->u.sao.ddec = Long(&cur->u.sao.ddec);
388 e9ad8994 2005-05-01 devnull cur->u.sao.mag = Short(&cur->u.sao.mag);
389 e9ad8994 2005-05-01 devnull cur->u.sao.mpg = Short(&cur->u.sao.mpg);
390 e9ad8994 2005-05-01 devnull cur->u.sao.hd = Long(&cur->u.sao.hd);
391 8a3b2ceb 2004-04-24 devnull return 1;
395 8a3b2ceb 2004-04-24 devnull loadplanet(int index, Record *r)
397 8a3b2ceb 2004-04-24 devnull if(index<0 || index>NPlanet || planet[index].name[0]=='\0')
398 8a3b2ceb 2004-04-24 devnull return 0;
400 8a3b2ceb 2004-04-24 devnull cur->type = Planet;
401 8a3b2ceb 2004-04-24 devnull cur->index = index;
402 8a3b2ceb 2004-04-24 devnull /* check whether to take new or existing record */
403 8a3b2ceb 2004-04-24 devnull if(r == nil)
404 e9ad8994 2005-05-01 devnull memmove(&cur->u.planet, &planet[index], sizeof(Planetrec));
406 e9ad8994 2005-05-01 devnull memmove(&cur->u.planet, &r->u.planet, sizeof(Planetrec));
407 8a3b2ceb 2004-04-24 devnull return 1;
411 8a3b2ceb 2004-04-24 devnull loadpatch(long index)
415 8a3b2ceb 2004-04-24 devnull patchopen();
416 8a3b2ceb 2004-04-24 devnull if(index<=0 || index>Npatch)
417 8a3b2ceb 2004-04-24 devnull return 0;
419 8a3b2ceb 2004-04-24 devnull cur->type = Patch;
420 8a3b2ceb 2004-04-24 devnull cur->index = index;
421 8a3b2ceb 2004-04-24 devnull seek(patchdb, patchaddr[index-1], 0);
422 e9ad8994 2005-05-01 devnull cur->u.patch.nkey = (patchaddr[index]-patchaddr[index-1])/4;
423 e9ad8994 2005-05-01 devnull Eread(patchdb, "patch", cur->u.patch.key, cur->u.patch.nkey*4);
424 e9ad8994 2005-05-01 devnull for(i=0; i<cur->u.patch.nkey; i++)
425 e9ad8994 2005-05-01 devnull cur->u.patch.key[i] = Long(&cur->u.patch.key[i]);
426 8a3b2ceb 2004-04-24 devnull return 1;
430 8a3b2ceb 2004-04-24 devnull loadtype(int t)
434 8a3b2ceb 2004-04-24 devnull ngcopen();
435 8a3b2ceb 2004-04-24 devnull for(i=0; i<NNGCrec; i++)
436 8a3b2ceb 2004-04-24 devnull if(t == (ngctype[i])){
438 8a3b2ceb 2004-04-24 devnull cur->type = NGCN;
439 8a3b2ceb 2004-04-24 devnull cur->index = i+1;
441 8a3b2ceb 2004-04-24 devnull return 1;
445 8a3b2ceb 2004-04-24 devnull flatten(void)
447 8a3b2ceb 2004-04-24 devnull int i, j, notflat;
448 8a3b2ceb 2004-04-24 devnull Record *or;
449 8a3b2ceb 2004-04-24 devnull long key;
453 8a3b2ceb 2004-04-24 devnull reset();
454 8a3b2ceb 2004-04-24 devnull notflat = 0;
455 8a3b2ceb 2004-04-24 devnull for(i=0,or=orec; i<norec; i++,or++){
456 8a3b2ceb 2004-04-24 devnull switch(or->type){
457 8a3b2ceb 2004-04-24 devnull default:
458 8a3b2ceb 2004-04-24 devnull fprint(2, "bad type %d in flatten\n", or->type);
461 8a3b2ceb 2004-04-24 devnull case NONGC:
464 8a3b2ceb 2004-04-24 devnull case Planet:
465 8a3b2ceb 2004-04-24 devnull case Abell:
466 8a3b2ceb 2004-04-24 devnull case NGC:
467 8a3b2ceb 2004-04-24 devnull case SAO:
469 8a3b2ceb 2004-04-24 devnull memmove(cur, or, sizeof(Record));
472 8a3b2ceb 2004-04-24 devnull case NGCN:
473 8a3b2ceb 2004-04-24 devnull if(loadngc(or->index))
474 8a3b2ceb 2004-04-24 devnull notflat = 1;
477 8a3b2ceb 2004-04-24 devnull case NamedSAO:
478 8a3b2ceb 2004-04-24 devnull loadsao(or->index);
479 8a3b2ceb 2004-04-24 devnull notflat = 1;
482 8a3b2ceb 2004-04-24 devnull case NamedNGC:
483 8a3b2ceb 2004-04-24 devnull if(loadngc(or->index))
484 8a3b2ceb 2004-04-24 devnull notflat = 1;
487 8a3b2ceb 2004-04-24 devnull case NamedAbell:
488 8a3b2ceb 2004-04-24 devnull loadabell(or->index);
489 8a3b2ceb 2004-04-24 devnull notflat = 1;
492 8a3b2ceb 2004-04-24 devnull case PatchC:
493 8a3b2ceb 2004-04-24 devnull loadpatch(or->index);
494 8a3b2ceb 2004-04-24 devnull notflat = 1;
497 8a3b2ceb 2004-04-24 devnull case Patch:
498 e9ad8994 2005-05-01 devnull for(j=1; j<or->u.patch.nkey; j++){
499 e9ad8994 2005-05-01 devnull key = or->u.patch.key[j];
500 8a3b2ceb 2004-04-24 devnull if((key&0x3F) == SAO)
501 8a3b2ceb 2004-04-24 devnull loadsao((key>>8)&0xFFFFFF);
502 8a3b2ceb 2004-04-24 devnull else if((key&0x3F) == Abell)
503 8a3b2ceb 2004-04-24 devnull loadabell((key>>8)&0xFFFFFF);
505 8a3b2ceb 2004-04-24 devnull loadngc((key>>16)&0xFFFF);
510 8a3b2ceb 2004-04-24 devnull if(notflat)
511 8a3b2ceb 2004-04-24 devnull goto loop;
515 8a3b2ceb 2004-04-24 devnull ism(int index)
519 8a3b2ceb 2004-04-24 devnull for(i=0; i<NMrec; i++)
520 8a3b2ceb 2004-04-24 devnull if(mindex[i].ngc == index)
521 8a3b2ceb 2004-04-24 devnull return 1;
522 8a3b2ceb 2004-04-24 devnull return 0;
526 8a3b2ceb 2004-04-24 devnull alpha(char *s, char *t)
530 8a3b2ceb 2004-04-24 devnull n = strlen(t);
531 8a3b2ceb 2004-04-24 devnull if(strncmp(s, t, n)==0 && (s[n]<'a' || 'z'<s[n]))
532 8a3b2ceb 2004-04-24 devnull return skipbl(s+n);
533 8a3b2ceb 2004-04-24 devnull return 0;
538 8a3b2ceb 2004-04-24 devnull text(char *s, char *t)
542 8a3b2ceb 2004-04-24 devnull n = strlen(t);
543 8a3b2ceb 2004-04-24 devnull if(strncmp(s, t, n)==0 && (s[n]==0 || s[n]==' ' || s[n]=='\t'))
544 8a3b2ceb 2004-04-24 devnull return skipbl(s+n);
545 8a3b2ceb 2004-04-24 devnull return 0;
550 8a3b2ceb 2004-04-24 devnull cull(char *s, int keep, int dobbox)
552 8a3b2ceb 2004-04-24 devnull int i, j, nobj, keepthis;
553 8a3b2ceb 2004-04-24 devnull Record *or;
554 8a3b2ceb 2004-04-24 devnull char *t;
555 8a3b2ceb 2004-04-24 devnull int dogrtr, doless, dom, dosao, dongc, doabell;
556 8a3b2ceb 2004-04-24 devnull int mgrtr, mless;
557 8a3b2ceb 2004-04-24 devnull char obj[100];
559 8a3b2ceb 2004-04-24 devnull memset(obj, 0, sizeof(obj));
560 8a3b2ceb 2004-04-24 devnull nobj = 0;
561 8a3b2ceb 2004-04-24 devnull dogrtr = 0;
562 8a3b2ceb 2004-04-24 devnull doless = 0;
563 8a3b2ceb 2004-04-24 devnull dom = 0;
564 8a3b2ceb 2004-04-24 devnull dongc = 0;
565 8a3b2ceb 2004-04-24 devnull dosao = 0;
566 8a3b2ceb 2004-04-24 devnull doabell = 0;
567 8a3b2ceb 2004-04-24 devnull mgrtr = mless= 0;
568 8a3b2ceb 2004-04-24 devnull if(dobbox)
569 8a3b2ceb 2004-04-24 devnull goto Cull;
570 8a3b2ceb 2004-04-24 devnull for(;;){
571 8a3b2ceb 2004-04-24 devnull if(s[0] == '>'){
572 8a3b2ceb 2004-04-24 devnull dogrtr = 1;
573 8a3b2ceb 2004-04-24 devnull mgrtr = 10 * strtod(s+1, &t);
574 8a3b2ceb 2004-04-24 devnull if(mgrtr==0 && t==s+1){
575 8a3b2ceb 2004-04-24 devnull fprint(2, "bad magnitude\n");
576 8a3b2ceb 2004-04-24 devnull return 0;
578 8a3b2ceb 2004-04-24 devnull s = skipbl(t);
579 8a3b2ceb 2004-04-24 devnull continue;
581 8a3b2ceb 2004-04-24 devnull if(s[0] == '<'){
582 8a3b2ceb 2004-04-24 devnull doless = 1;
583 8a3b2ceb 2004-04-24 devnull mless = 10 * strtod(s+1, &t);
584 8a3b2ceb 2004-04-24 devnull if(mless==0 && t==s+1){
585 8a3b2ceb 2004-04-24 devnull fprint(2, "bad magnitude\n");
586 8a3b2ceb 2004-04-24 devnull return 0;
588 8a3b2ceb 2004-04-24 devnull s = skipbl(t);
589 8a3b2ceb 2004-04-24 devnull continue;
591 8a3b2ceb 2004-04-24 devnull if(t = text(s, "m")){
592 8a3b2ceb 2004-04-24 devnull dom = 1;
594 8a3b2ceb 2004-04-24 devnull continue;
596 8a3b2ceb 2004-04-24 devnull if(t = text(s, "sao")){
597 8a3b2ceb 2004-04-24 devnull dosao = 1;
599 8a3b2ceb 2004-04-24 devnull continue;
601 8a3b2ceb 2004-04-24 devnull if(t = text(s, "ngc")){
602 8a3b2ceb 2004-04-24 devnull dongc = 1;
604 8a3b2ceb 2004-04-24 devnull continue;
606 8a3b2ceb 2004-04-24 devnull if(t = text(s, "abell")){
607 8a3b2ceb 2004-04-24 devnull doabell = 1;
609 8a3b2ceb 2004-04-24 devnull continue;
611 8a3b2ceb 2004-04-24 devnull for(i=0; names[i].name; i++)
612 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, names[i].name)){
613 8a3b2ceb 2004-04-24 devnull if(nobj > 100){
614 8a3b2ceb 2004-04-24 devnull fprint(2, "too many object types\n");
615 8a3b2ceb 2004-04-24 devnull return 0;
617 8a3b2ceb 2004-04-24 devnull obj[nobj++] = names[i].type;
619 8a3b2ceb 2004-04-24 devnull goto Continue;
622 8a3b2ceb 2004-04-24 devnull Continue:;
625 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in object list\n");
626 8a3b2ceb 2004-04-24 devnull return 0;
630 8a3b2ceb 2004-04-24 devnull flatten();
632 8a3b2ceb 2004-04-24 devnull reset();
634 8a3b2ceb 2004-04-24 devnull mopen();
635 8a3b2ceb 2004-04-24 devnull if(dosao)
636 8a3b2ceb 2004-04-24 devnull saoopen();
637 8a3b2ceb 2004-04-24 devnull if(dongc || nobj)
638 8a3b2ceb 2004-04-24 devnull ngcopen();
639 8a3b2ceb 2004-04-24 devnull if(doabell)
640 8a3b2ceb 2004-04-24 devnull abellopen();
641 8a3b2ceb 2004-04-24 devnull for(i=0,or=orec; i<norec; i++,or++){
642 8a3b2ceb 2004-04-24 devnull keepthis = !keep;
643 e9ad8994 2005-05-01 devnull if(dobbox && inbbox(or->u.ngc.ra, or->u.ngc.dec))
644 8a3b2ceb 2004-04-24 devnull keepthis = keep;
645 e9ad8994 2005-05-01 devnull if(doless && or->u.ngc.mag <= mless)
646 e9ad8994 2005-05-01 devnull keepthis = keep;
647 e9ad8994 2005-05-01 devnull if(dogrtr && or->u.ngc.mag >= mgrtr)
648 8a3b2ceb 2004-04-24 devnull keepthis = keep;
649 e9ad8994 2005-05-01 devnull if(dom && (or->type==NGC && ism(or->u.ngc.ngc)))
650 8a3b2ceb 2004-04-24 devnull keepthis = keep;
651 8a3b2ceb 2004-04-24 devnull if(dongc && or->type==NGC)
652 8a3b2ceb 2004-04-24 devnull keepthis = keep;
653 8a3b2ceb 2004-04-24 devnull if(doabell && or->type==Abell)
654 8a3b2ceb 2004-04-24 devnull keepthis = keep;
655 8a3b2ceb 2004-04-24 devnull if(dosao && or->type==SAO)
656 8a3b2ceb 2004-04-24 devnull keepthis = keep;
657 8a3b2ceb 2004-04-24 devnull for(j=0; j<nobj; j++)
658 e9ad8994 2005-05-01 devnull if(or->type==NGC && or->u.ngc.type==obj[j])
659 8a3b2ceb 2004-04-24 devnull keepthis = keep;
660 8a3b2ceb 2004-04-24 devnull if(keepthis){
662 8a3b2ceb 2004-04-24 devnull memmove(cur, or, sizeof(Record));
665 8a3b2ceb 2004-04-24 devnull return 1;
669 8a3b2ceb 2004-04-24 devnull compar(const void *va, const void *vb)
671 8a3b2ceb 2004-04-24 devnull Record *a=(Record*)va, *b=(Record*)vb;
673 8a3b2ceb 2004-04-24 devnull if(a->type == b->type)
674 8a3b2ceb 2004-04-24 devnull return a->index - b->index;
675 8a3b2ceb 2004-04-24 devnull return a->type - b->type;
679 8a3b2ceb 2004-04-24 devnull sort(void)
682 8a3b2ceb 2004-04-24 devnull Record *r, *s;
684 8a3b2ceb 2004-04-24 devnull if(nrec == 0)
686 8a3b2ceb 2004-04-24 devnull qsort(rec, nrec, sizeof(Record), compar);
687 8a3b2ceb 2004-04-24 devnull r = rec+1;
688 8a3b2ceb 2004-04-24 devnull s = rec;
689 8a3b2ceb 2004-04-24 devnull for(i=1; i<nrec; i++,r++){
690 8a3b2ceb 2004-04-24 devnull /* may have multiple instances of a planet in the scene */
691 8a3b2ceb 2004-04-24 devnull if(r->type==s->type && r->index==s->index && r->type!=Planet)
692 8a3b2ceb 2004-04-24 devnull continue;
693 8a3b2ceb 2004-04-24 devnull memmove(++s, r, sizeof(Record));
695 8a3b2ceb 2004-04-24 devnull nrec = (s+1)-rec;
698 8a3b2ceb 2004-04-24 devnull char greekbuf[128];
701 8a3b2ceb 2004-04-24 devnull togreek(char *s)
703 8a3b2ceb 2004-04-24 devnull char *t;
704 8a3b2ceb 2004-04-24 devnull int i, n;
707 8a3b2ceb 2004-04-24 devnull t = greekbuf;
708 8a3b2ceb 2004-04-24 devnull while(*s){
709 8a3b2ceb 2004-04-24 devnull for(i=1; i<=24; i++){
710 8a3b2ceb 2004-04-24 devnull n = strlen(greek[i]);
711 8a3b2ceb 2004-04-24 devnull if(strncmp(s, greek[i], n)==0 && (s[n]==' ' || s[n]=='\t')){
713 8a3b2ceb 2004-04-24 devnull t += runetochar(t, &greeklet[i]);
714 8a3b2ceb 2004-04-24 devnull goto Cont;
717 8a3b2ceb 2004-04-24 devnull n = chartorune(&r, s);
718 8a3b2ceb 2004-04-24 devnull for(i=0; i<n; i++)
719 8a3b2ceb 2004-04-24 devnull *t++ = *s++;
723 8a3b2ceb 2004-04-24 devnull return greekbuf;
727 8a3b2ceb 2004-04-24 devnull fromgreek(char *s)
729 8a3b2ceb 2004-04-24 devnull char *t;
730 8a3b2ceb 2004-04-24 devnull int i, n;
733 8a3b2ceb 2004-04-24 devnull t = greekbuf;
734 8a3b2ceb 2004-04-24 devnull while(*s){
735 8a3b2ceb 2004-04-24 devnull n = chartorune(&r, s);
736 8a3b2ceb 2004-04-24 devnull for(i=1; i<=24; i++){
737 8a3b2ceb 2004-04-24 devnull if(r == greeklet[i]){
738 8a3b2ceb 2004-04-24 devnull strcpy(t, greek[i]);
739 8a3b2ceb 2004-04-24 devnull t += strlen(greek[i]);
741 8a3b2ceb 2004-04-24 devnull goto Cont;
744 8a3b2ceb 2004-04-24 devnull for(i=0; i<n; i++)
745 8a3b2ceb 2004-04-24 devnull *t++ = *s++;
749 8a3b2ceb 2004-04-24 devnull return greekbuf;
752 8a3b2ceb 2004-04-24 devnull #ifdef OLD
754 8a3b2ceb 2004-04-24 devnull * Old version
757 8a3b2ceb 2004-04-24 devnull coords(int deg)
760 8a3b2ceb 2004-04-24 devnull int x, y;
761 8a3b2ceb 2004-04-24 devnull Record *or;
762 8a3b2ceb 2004-04-24 devnull long dec, ra, ndec, nra;
763 8a3b2ceb 2004-04-24 devnull int rdeg;
765 8a3b2ceb 2004-04-24 devnull flatten();
767 8a3b2ceb 2004-04-24 devnull reset();
768 8a3b2ceb 2004-04-24 devnull deg *= 2;
769 8a3b2ceb 2004-04-24 devnull for(i=0,or=orec; i<norec; i++,or++){
770 8a3b2ceb 2004-04-24 devnull if(or->type == Planet) /* must keep it here */
771 8a3b2ceb 2004-04-24 devnull loadplanet(or->index, or);
772 e9ad8994 2005-05-01 devnull dec = or->u.ngc.dec/MILLIARCSEC;
773 e9ad8994 2005-05-01 devnull ra = or->u.ngc.ra/MILLIARCSEC;
774 8a3b2ceb 2004-04-24 devnull rdeg = deg/cos((dec*PI)/180);
775 8a3b2ceb 2004-04-24 devnull for(y=-deg; y<=+deg; y++){
776 8a3b2ceb 2004-04-24 devnull ndec = dec*2+y;
777 8a3b2ceb 2004-04-24 devnull if(ndec/2>=90 || ndec/2<=-90)
778 8a3b2ceb 2004-04-24 devnull continue;
779 8a3b2ceb 2004-04-24 devnull /* fp errors hurt here, so we round 1' to the pole */
780 8a3b2ceb 2004-04-24 devnull if(ndec >= 0)
781 8a3b2ceb 2004-04-24 devnull ndec = ndec*500*60*60 + 60000;
783 8a3b2ceb 2004-04-24 devnull ndec = ndec*500*60*60 - 60000;
784 8a3b2ceb 2004-04-24 devnull for(x=-rdeg; x<=+rdeg; x++){
785 8a3b2ceb 2004-04-24 devnull nra = ra*2+x;
786 8a3b2ceb 2004-04-24 devnull if(nra/2 < 0)
787 8a3b2ceb 2004-04-24 devnull nra += 360*2;
788 8a3b2ceb 2004-04-24 devnull if(nra/2 >= 360)
789 8a3b2ceb 2004-04-24 devnull nra -= 360*2;
790 8a3b2ceb 2004-04-24 devnull /* fp errors hurt here, so we round up 1' */
791 8a3b2ceb 2004-04-24 devnull nra = nra/2*MILLIARCSEC + 60000;
792 8a3b2ceb 2004-04-24 devnull loadpatch(patcha(angle(nra), angle(ndec)));
797 8a3b2ceb 2004-04-24 devnull return 1;
802 8a3b2ceb 2004-04-24 devnull * New version attempts to match the boundaries of the plot better.
805 8a3b2ceb 2004-04-24 devnull coords(int deg)
808 8a3b2ceb 2004-04-24 devnull int x, y, xx;
809 8a3b2ceb 2004-04-24 devnull Record *or;
810 8a3b2ceb 2004-04-24 devnull long min, circle;
811 8a3b2ceb 2004-04-24 devnull double factor;
813 8a3b2ceb 2004-04-24 devnull flatten();
814 8a3b2ceb 2004-04-24 devnull circle = 360*MILLIARCSEC;
815 8a3b2ceb 2004-04-24 devnull deg *= MILLIARCSEC;
817 8a3b2ceb 2004-04-24 devnull /* find center */
818 8a3b2ceb 2004-04-24 devnull folded = 0;
819 8a3b2ceb 2004-04-24 devnull bbox(0, 0, 0);
820 8a3b2ceb 2004-04-24 devnull /* now expand */
821 8a3b2ceb 2004-04-24 devnull factor = cos(angle((decmax+decmin)/2));
822 8a3b2ceb 2004-04-24 devnull if(factor < .2)
823 8a3b2ceb 2004-04-24 devnull factor = .2;
824 8a3b2ceb 2004-04-24 devnull factor = floor(1/factor);
825 8a3b2ceb 2004-04-24 devnull folded = 0;
826 8a3b2ceb 2004-04-24 devnull bbox(factor*deg, deg, 1);
827 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s to ", hms(angle(ramin)));
828 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s\n", hms(angle(ramax)));
829 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s to ", dms(angle(decmin)));
830 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s\n", dms(angle(decmax)));
832 8a3b2ceb 2004-04-24 devnull reset();
833 8a3b2ceb 2004-04-24 devnull for(i=0,or=orec; i<norec; i++,or++)
834 8a3b2ceb 2004-04-24 devnull if(or->type == Planet) /* must keep it here */
835 8a3b2ceb 2004-04-24 devnull loadplanet(or->index, or);
836 8a3b2ceb 2004-04-24 devnull min = ramin;
837 8a3b2ceb 2004-04-24 devnull if(ramin > ramax)
838 8a3b2ceb 2004-04-24 devnull min -= circle;
839 8a3b2ceb 2004-04-24 devnull for(x=min; x<=ramax; x+=250*60*60){
841 8a3b2ceb 2004-04-24 devnull if(xx < 0)
842 8a3b2ceb 2004-04-24 devnull xx += circle;
843 8a3b2ceb 2004-04-24 devnull for(y=decmin; y<=decmax; y+=250*60*60)
844 8a3b2ceb 2004-04-24 devnull if(-circle/4 < y && y < circle/4)
845 8a3b2ceb 2004-04-24 devnull loadpatch(patcha(angle(xx), angle(y)));
848 8a3b2ceb 2004-04-24 devnull cull(nil, 1, 1);
849 8a3b2ceb 2004-04-24 devnull return 1;
853 8a3b2ceb 2004-04-24 devnull pplate(char *flags)
857 8a3b2ceb 2004-04-24 devnull int na, rah, ram, d1, d2;
858 8a3b2ceb 2004-04-24 devnull double r0;
859 8a3b2ceb 2004-04-24 devnull int ra, dec;
860 8a3b2ceb 2004-04-24 devnull long ramin, ramax, decmin, decmax; /* all in degrees */
861 8a3b2ceb 2004-04-24 devnull Record *r;
862 8a3b2ceb 2004-04-24 devnull int folded;
863 8a3b2ceb 2004-04-24 devnull Angle racenter, deccenter, rasize, decsize, a[4];
864 8a3b2ceb 2004-04-24 devnull Picture *pic;
866 8a3b2ceb 2004-04-24 devnull rasize = -1.0;
867 8a3b2ceb 2004-04-24 devnull decsize = -1.0;
869 8a3b2ceb 2004-04-24 devnull for(;;){
870 8a3b2ceb 2004-04-24 devnull while(*flags==' ')
871 8a3b2ceb 2004-04-24 devnull flags++;
872 8a3b2ceb 2004-04-24 devnull if(('0'<=*flags && *flags<='9') || *flags=='+' || *flags=='-'){
873 8a3b2ceb 2004-04-24 devnull if(na >= 3)
874 8a3b2ceb 2004-04-24 devnull goto err;
875 8a3b2ceb 2004-04-24 devnull a[na++] = getra(flags);
876 8a3b2ceb 2004-04-24 devnull while(*flags && *flags!=' ')
877 8a3b2ceb 2004-04-24 devnull flags++;
878 8a3b2ceb 2004-04-24 devnull continue;
880 8a3b2ceb 2004-04-24 devnull if(*flags){
882 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "syntax error in plate\n");
887 8a3b2ceb 2004-04-24 devnull switch(na){
891 8a3b2ceb 2004-04-24 devnull rasize = a[0];
892 8a3b2ceb 2004-04-24 devnull decsize = rasize;
895 8a3b2ceb 2004-04-24 devnull rasize = a[0];
896 8a3b2ceb 2004-04-24 devnull decsize = a[1];
900 8a3b2ceb 2004-04-24 devnull racenter = a[0];
901 8a3b2ceb 2004-04-24 devnull deccenter = a[1];
902 8a3b2ceb 2004-04-24 devnull rasize = a[2];
903 8a3b2ceb 2004-04-24 devnull if(na == 4)
904 8a3b2ceb 2004-04-24 devnull decsize = a[3];
906 8a3b2ceb 2004-04-24 devnull decsize = rasize;
907 8a3b2ceb 2004-04-24 devnull if(rasize<0.0 || decsize<0.0){
908 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "negative sizes\n");
911 8a3b2ceb 2004-04-24 devnull goto done;
913 8a3b2ceb 2004-04-24 devnull folded = 0;
914 8a3b2ceb 2004-04-24 devnull /* convert to milliarcsec */
915 8a3b2ceb 2004-04-24 devnull c = 1000*60*60;
917 8a3b2ceb 2004-04-24 devnull if(nrec == 0){
918 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "empty\n");
921 8a3b2ceb 2004-04-24 devnull ramin = 0x7FFFFFFF;
922 8a3b2ceb 2004-04-24 devnull ramax = -0x7FFFFFFF;
923 8a3b2ceb 2004-04-24 devnull decmin = 0x7FFFFFFF;
924 8a3b2ceb 2004-04-24 devnull decmax = -0x7FFFFFFF;
925 8a3b2ceb 2004-04-24 devnull for(r=rec,i=0; i<nrec; i++,r++){
926 8a3b2ceb 2004-04-24 devnull if(r->type == Patch){
927 8a3b2ceb 2004-04-24 devnull radec(r->index, &rah, &ram, &dec);
928 8a3b2ceb 2004-04-24 devnull ra = 15*rah+ram/4;
929 8a3b2ceb 2004-04-24 devnull r0 = c/cos(RAD(dec));
930 8a3b2ceb 2004-04-24 devnull ra *= c;
931 8a3b2ceb 2004-04-24 devnull dec *= c;
932 8a3b2ceb 2004-04-24 devnull if(dec == 0)
933 8a3b2ceb 2004-04-24 devnull d1 = c, d2 = c;
934 8a3b2ceb 2004-04-24 devnull else if(dec < 0)
935 8a3b2ceb 2004-04-24 devnull d1 = c, d2 = 0;
937 8a3b2ceb 2004-04-24 devnull d1 = 0, d2 = c;
938 8a3b2ceb 2004-04-24 devnull }else if(r->type==SAO || r->type==NGC || r->type==Abell){
939 e9ad8994 2005-05-01 devnull ra = r->u.ngc.ra;
940 e9ad8994 2005-05-01 devnull dec = r->u.ngc.dec;
941 8a3b2ceb 2004-04-24 devnull d1 = 0, d2 = 0, r0 = 0;
942 8a3b2ceb 2004-04-24 devnull }else if(r->type==NGCN){
943 8a3b2ceb 2004-04-24 devnull loadngc(r->index);
944 8a3b2ceb 2004-04-24 devnull continue;
945 8a3b2ceb 2004-04-24 devnull }else if(r->type==NamedSAO){
946 8a3b2ceb 2004-04-24 devnull loadsao(r->index);
947 8a3b2ceb 2004-04-24 devnull continue;
948 8a3b2ceb 2004-04-24 devnull }else if(r->type==NamedNGC){
949 8a3b2ceb 2004-04-24 devnull loadngc(r->index);
950 8a3b2ceb 2004-04-24 devnull continue;
951 8a3b2ceb 2004-04-24 devnull }else if(r->type==NamedAbell){
952 8a3b2ceb 2004-04-24 devnull loadabell(r->index);
953 8a3b2ceb 2004-04-24 devnull continue;
955 8a3b2ceb 2004-04-24 devnull continue;
956 8a3b2ceb 2004-04-24 devnull if(dec+d2 > decmax)
957 8a3b2ceb 2004-04-24 devnull decmax = dec+d2;
958 8a3b2ceb 2004-04-24 devnull if(dec-d1 < decmin)
959 8a3b2ceb 2004-04-24 devnull decmin = dec-d1;
960 8a3b2ceb 2004-04-24 devnull if(folded){
961 8a3b2ceb 2004-04-24 devnull ra -= 180*c;
962 8a3b2ceb 2004-04-24 devnull if(ra < 0)
963 8a3b2ceb 2004-04-24 devnull ra += 360*c;
965 8a3b2ceb 2004-04-24 devnull if(ra+r0 > ramax)
966 8a3b2ceb 2004-04-24 devnull ramax = ra+r0;
967 8a3b2ceb 2004-04-24 devnull if(ra < ramin)
968 8a3b2ceb 2004-04-24 devnull ramin = ra;
970 8a3b2ceb 2004-04-24 devnull if(!folded && ramax-ramin>270*c){
971 8a3b2ceb 2004-04-24 devnull folded = 1;
972 8a3b2ceb 2004-04-24 devnull goto Again;
974 8a3b2ceb 2004-04-24 devnull racenter = angle(ramin+(ramax-ramin)/2);
975 8a3b2ceb 2004-04-24 devnull deccenter = angle(decmin+(decmax-decmin)/2);
976 8a3b2ceb 2004-04-24 devnull if(rasize<0 || decsize<0){
977 8a3b2ceb 2004-04-24 devnull rasize = angle(ramax-ramin)*cos(deccenter);
978 8a3b2ceb 2004-04-24 devnull decsize = angle(decmax-decmin);
981 8a3b2ceb 2004-04-24 devnull if(DEG(rasize)>1.1 || DEG(decsize)>1.1){
982 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "plate too big: %s", ms(rasize));
983 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " x %s\n", ms(decsize));
984 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "trimming to 30'x30'\n");
985 8a3b2ceb 2004-04-24 devnull rasize = RAD(0.5);
986 8a3b2ceb 2004-04-24 devnull decsize = RAD(0.5);
988 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s %s ", hms(racenter), dms(deccenter));
989 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s", ms(rasize));
990 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " x %s\n", ms(decsize));
991 8a3b2ceb 2004-04-24 devnull Bflush(&bout);
992 8a3b2ceb 2004-04-24 devnull flatten();
993 8a3b2ceb 2004-04-24 devnull pic = image(racenter, deccenter, rasize, decsize);
994 8a3b2ceb 2004-04-24 devnull if(pic == 0)
996 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "plate %s locn %d %d %d %d\n", pic->name, pic->minx, pic->miny, pic->maxx, pic->maxy);
997 8a3b2ceb 2004-04-24 devnull Bflush(&bout);
998 8a3b2ceb 2004-04-24 devnull displaypic(pic);
1002 8a3b2ceb 2004-04-24 devnull lookup(char *s, int doreset)
1004 8a3b2ceb 2004-04-24 devnull int i, j, k;
1005 8a3b2ceb 2004-04-24 devnull int rah, ram, deg;
1006 8a3b2ceb 2004-04-24 devnull char *starts, *inputline=s, *t, *u;
1007 8a3b2ceb 2004-04-24 devnull Record *r;
1008 8a3b2ceb 2004-04-24 devnull Rune c;
1009 8a3b2ceb 2004-04-24 devnull long n;
1010 8a3b2ceb 2004-04-24 devnull double x;
1011 8a3b2ceb 2004-04-24 devnull Angle ra;
1013 8a3b2ceb 2004-04-24 devnull lowercase(s);
1014 8a3b2ceb 2004-04-24 devnull s = skipbl(s);
1016 8a3b2ceb 2004-04-24 devnull if(*s == 0)
1017 8a3b2ceb 2004-04-24 devnull goto Print;
1019 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "flat")){
1020 8a3b2ceb 2004-04-24 devnull if(*t){
1021 8a3b2ceb 2004-04-24 devnull fprint(2, "flat takes no arguments\n");
1022 8a3b2ceb 2004-04-24 devnull return;
1024 8a3b2ceb 2004-04-24 devnull if(nrec == 0){
1025 8a3b2ceb 2004-04-24 devnull fprint(2, "no records\n");
1026 8a3b2ceb 2004-04-24 devnull return;
1028 8a3b2ceb 2004-04-24 devnull flatten();
1029 8a3b2ceb 2004-04-24 devnull goto Print;
1032 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "print")){
1033 8a3b2ceb 2004-04-24 devnull if(*t){
1034 8a3b2ceb 2004-04-24 devnull fprint(2, "print takes no arguments\n");
1035 8a3b2ceb 2004-04-24 devnull return;
1037 8a3b2ceb 2004-04-24 devnull for(i=0,r=rec; i<nrec; i++,r++)
1038 8a3b2ceb 2004-04-24 devnull prrec(r);
1039 8a3b2ceb 2004-04-24 devnull return;
1042 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "add")){
1043 8a3b2ceb 2004-04-24 devnull lookup(t, 0);
1044 8a3b2ceb 2004-04-24 devnull return;
1047 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "sao")){
1048 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1049 8a3b2ceb 2004-04-24 devnull if(n<=0 || n>NSAO)
1050 8a3b2ceb 2004-04-24 devnull goto NotFound;
1051 8a3b2ceb 2004-04-24 devnull t = skipbl(u);
1052 8a3b2ceb 2004-04-24 devnull if(*t){
1053 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in sao\n");
1054 8a3b2ceb 2004-04-24 devnull return;
1056 8a3b2ceb 2004-04-24 devnull if(doreset)
1057 8a3b2ceb 2004-04-24 devnull reset();
1058 8a3b2ceb 2004-04-24 devnull if(!loadsao(n))
1059 8a3b2ceb 2004-04-24 devnull goto NotFound;
1060 8a3b2ceb 2004-04-24 devnull goto Print;
1063 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "ngc")){
1064 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1065 8a3b2ceb 2004-04-24 devnull if(n<=0 || n>NNGC)
1066 8a3b2ceb 2004-04-24 devnull goto NotFound;
1067 8a3b2ceb 2004-04-24 devnull t = skipbl(u);
1068 8a3b2ceb 2004-04-24 devnull if(*t){
1069 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in ngc\n");
1070 8a3b2ceb 2004-04-24 devnull return;
1072 8a3b2ceb 2004-04-24 devnull if(doreset)
1073 8a3b2ceb 2004-04-24 devnull reset();
1074 8a3b2ceb 2004-04-24 devnull if(!loadngc(n))
1075 8a3b2ceb 2004-04-24 devnull goto NotFound;
1076 8a3b2ceb 2004-04-24 devnull goto Print;
1079 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "ic")){
1080 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1081 8a3b2ceb 2004-04-24 devnull if(n<=0 || n>NIC)
1082 8a3b2ceb 2004-04-24 devnull goto NotFound;
1083 8a3b2ceb 2004-04-24 devnull t = skipbl(u);
1084 8a3b2ceb 2004-04-24 devnull if(*t){
1085 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in ic\n");
1086 8a3b2ceb 2004-04-24 devnull return;
1088 8a3b2ceb 2004-04-24 devnull if(doreset)
1089 8a3b2ceb 2004-04-24 devnull reset();
1090 8a3b2ceb 2004-04-24 devnull if(!loadngc(n+NNGC))
1091 8a3b2ceb 2004-04-24 devnull goto NotFound;
1092 8a3b2ceb 2004-04-24 devnull goto Print;
1095 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "abell")){
1096 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1097 8a3b2ceb 2004-04-24 devnull if(n<=0 || n>NAbell)
1098 8a3b2ceb 2004-04-24 devnull goto NotFound;
1099 8a3b2ceb 2004-04-24 devnull if(doreset)
1100 8a3b2ceb 2004-04-24 devnull reset();
1101 8a3b2ceb 2004-04-24 devnull if(!loadabell(n))
1102 8a3b2ceb 2004-04-24 devnull goto NotFound;
1103 8a3b2ceb 2004-04-24 devnull goto Print;
1106 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "m")){
1107 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1108 8a3b2ceb 2004-04-24 devnull if(n<=0 || n>NM)
1109 8a3b2ceb 2004-04-24 devnull goto NotFound;
1110 8a3b2ceb 2004-04-24 devnull mopen();
1111 8a3b2ceb 2004-04-24 devnull for(j=n-1; mindex[j].m<n; j++)
1113 8a3b2ceb 2004-04-24 devnull if(doreset)
1114 8a3b2ceb 2004-04-24 devnull reset();
1115 8a3b2ceb 2004-04-24 devnull while(mindex[j].m == n){
1116 8a3b2ceb 2004-04-24 devnull if(mindex[j].ngc){
1117 8a3b2ceb 2004-04-24 devnull grow();
1118 8a3b2ceb 2004-04-24 devnull cur->type = NGCN;
1119 8a3b2ceb 2004-04-24 devnull cur->index = mindex[j].ngc;
1123 8a3b2ceb 2004-04-24 devnull goto Print;
1126 8a3b2ceb 2004-04-24 devnull for(i=1; i<=Ncon; i++)
1127 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, constel[i])){
1128 8a3b2ceb 2004-04-24 devnull if(*t){
1129 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in constellation\n");
1130 8a3b2ceb 2004-04-24 devnull return;
1132 8a3b2ceb 2004-04-24 devnull constelopen();
1133 8a3b2ceb 2004-04-24 devnull seek(condb, 4L*conindex[i-1], 0);
1134 8a3b2ceb 2004-04-24 devnull j = conindex[i]-conindex[i-1];
1135 8a3b2ceb 2004-04-24 devnull Eread(condb, "con", con, 4*j);
1136 8a3b2ceb 2004-04-24 devnull if(doreset)
1137 8a3b2ceb 2004-04-24 devnull reset();
1138 8a3b2ceb 2004-04-24 devnull for(k=0; k<j; k++){
1139 8a3b2ceb 2004-04-24 devnull grow();
1140 8a3b2ceb 2004-04-24 devnull cur->type = PatchC;
1141 8a3b2ceb 2004-04-24 devnull cur->index = Long(&con[k]);
1143 8a3b2ceb 2004-04-24 devnull goto Print;
1146 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "expand")){
1148 8a3b2ceb 2004-04-24 devnull if(*t){
1149 8a3b2ceb 2004-04-24 devnull if(*t<'0' && '9'<*t){
1150 8a3b2ceb 2004-04-24 devnull Expanderr:
1151 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in expand\n");
1152 8a3b2ceb 2004-04-24 devnull return;
1154 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1155 8a3b2ceb 2004-04-24 devnull t = skipbl(u);
1157 8a3b2ceb 2004-04-24 devnull goto Expanderr;
1159 8a3b2ceb 2004-04-24 devnull coords(n);
1160 8a3b2ceb 2004-04-24 devnull goto Print;
1163 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "plot")){
1164 8a3b2ceb 2004-04-24 devnull if(nrec == 0){
1165 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "empty\n");
1166 8a3b2ceb 2004-04-24 devnull return;
1168 8a3b2ceb 2004-04-24 devnull plot(t);
1169 8a3b2ceb 2004-04-24 devnull return;
1172 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "astro")){
1173 8a3b2ceb 2004-04-24 devnull astro(t, 0);
1174 8a3b2ceb 2004-04-24 devnull return;
1177 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "plate")){
1178 8a3b2ceb 2004-04-24 devnull pplate(t);
1179 8a3b2ceb 2004-04-24 devnull return;
1182 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "gamma")){
1183 8a3b2ceb 2004-04-24 devnull while(*t==' ')
1186 8a3b2ceb 2004-04-24 devnull x = strtod(t, &u);
1187 8a3b2ceb 2004-04-24 devnull if(u > t)
1188 8a3b2ceb 2004-04-24 devnull gam.gamma = x;
1189 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%.2f\n", gam.gamma);
1190 8a3b2ceb 2004-04-24 devnull return;
1193 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "keep")){
1194 8a3b2ceb 2004-04-24 devnull if(!cull(t, 1, 0))
1195 8a3b2ceb 2004-04-24 devnull return;
1196 8a3b2ceb 2004-04-24 devnull goto Print;
1199 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "drop")){
1200 8a3b2ceb 2004-04-24 devnull if(!cull(t, 0, 0))
1201 8a3b2ceb 2004-04-24 devnull return;
1202 8a3b2ceb 2004-04-24 devnull goto Print;
1205 8a3b2ceb 2004-04-24 devnull for(i=0; planet[i].name[0]; i++){
1206 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, planet[i].name)){
1207 8a3b2ceb 2004-04-24 devnull if(doreset)
1208 8a3b2ceb 2004-04-24 devnull reset();
1209 8a3b2ceb 2004-04-24 devnull loadplanet(i, nil);
1210 8a3b2ceb 2004-04-24 devnull goto Print;
1214 8a3b2ceb 2004-04-24 devnull for(i=0; names[i].name; i++){
1215 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, names[i].name)){
1216 8a3b2ceb 2004-04-24 devnull if(*t){
1217 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in type\n");
1218 8a3b2ceb 2004-04-24 devnull return;
1220 8a3b2ceb 2004-04-24 devnull if(doreset)
1221 8a3b2ceb 2004-04-24 devnull reset();
1222 8a3b2ceb 2004-04-24 devnull loadtype(names[i].type);
1223 8a3b2ceb 2004-04-24 devnull goto Print;
1227 8a3b2ceb 2004-04-24 devnull switch(s[0]){
1228 8a3b2ceb 2004-04-24 devnull case '"':
1229 8a3b2ceb 2004-04-24 devnull starts = ++s;
1230 8a3b2ceb 2004-04-24 devnull while(*s != '"')
1231 8a3b2ceb 2004-04-24 devnull if(*s++ == 0){
1232 8a3b2ceb 2004-04-24 devnull fprint(2, "bad star name\n");
1233 8a3b2ceb 2004-04-24 devnull return;
1235 8a3b2ceb 2004-04-24 devnull *s = 0;
1236 8a3b2ceb 2004-04-24 devnull if(doreset)
1237 8a3b2ceb 2004-04-24 devnull reset();
1238 8a3b2ceb 2004-04-24 devnull j = nrec;
1239 8a3b2ceb 2004-04-24 devnull saoopen();
1240 8a3b2ceb 2004-04-24 devnull starts = fromgreek(starts);
1241 8a3b2ceb 2004-04-24 devnull for(i=0; i<NName; i++)
1242 8a3b2ceb 2004-04-24 devnull if(equal(starts, name[i].name)){
1243 8a3b2ceb 2004-04-24 devnull grow();
1244 8a3b2ceb 2004-04-24 devnull if(name[i].sao){
1245 8a3b2ceb 2004-04-24 devnull rec[j].type = NamedSAO;
1246 8a3b2ceb 2004-04-24 devnull rec[j].index = name[i].sao;
1248 8a3b2ceb 2004-04-24 devnull if(name[i].ngc){
1249 8a3b2ceb 2004-04-24 devnull rec[j].type = NamedNGC;
1250 8a3b2ceb 2004-04-24 devnull rec[j].index = name[i].ngc;
1252 8a3b2ceb 2004-04-24 devnull if(name[i].abell){
1253 8a3b2ceb 2004-04-24 devnull rec[j].type = NamedAbell;
1254 8a3b2ceb 2004-04-24 devnull rec[j].index = name[i].abell;
1256 e9ad8994 2005-05-01 devnull strcpy(rec[j].u.named.name, name[i].name);
1259 8a3b2ceb 2004-04-24 devnull if(parsename(starts))
1260 8a3b2ceb 2004-04-24 devnull for(i=0; i<NBayer; i++)
1261 8a3b2ceb 2004-04-24 devnull if(bayer[i].name[0]==parsed[0] &&
1262 8a3b2ceb 2004-04-24 devnull (bayer[i].name[1]==parsed[1] || parsed[1]==0) &&
1263 8a3b2ceb 2004-04-24 devnull bayer[i].name[2]==parsed[2]){
1264 8a3b2ceb 2004-04-24 devnull grow();
1265 8a3b2ceb 2004-04-24 devnull rec[j].type = NamedSAO;
1266 8a3b2ceb 2004-04-24 devnull rec[j].index = bayer[i].sao;
1267 e9ad8994 2005-05-01 devnull strncpy(rec[j].u.named.name, starts, sizeof(rec[j].u.named.name));
1270 8a3b2ceb 2004-04-24 devnull if(j == 0){
1271 8a3b2ceb 2004-04-24 devnull *s = '"';
1272 8a3b2ceb 2004-04-24 devnull goto NotFound;
1276 8a3b2ceb 2004-04-24 devnull case '0': case '1': case '2': case '3': case '4':
1277 8a3b2ceb 2004-04-24 devnull case '5': case '6': case '7': case '8': case '9':
1278 8a3b2ceb 2004-04-24 devnull strtoul(s, &t, 10);
1279 8a3b2ceb 2004-04-24 devnull if(*t != 'h'){
1280 8a3b2ceb 2004-04-24 devnull BadCoords:
1281 8a3b2ceb 2004-04-24 devnull fprint(2, "bad coordinates %s\n", inputline);
1284 8a3b2ceb 2004-04-24 devnull ra = DEG(getra(s));
1285 8a3b2ceb 2004-04-24 devnull while(*s && *s!=' ' && *s!='\t')
1287 8a3b2ceb 2004-04-24 devnull rah = ra/15;
1288 8a3b2ceb 2004-04-24 devnull ra = ra-rah*15;
1289 8a3b2ceb 2004-04-24 devnull ram = ra*4;
1290 8a3b2ceb 2004-04-24 devnull deg = strtol(s, &t, 10);
1291 8a3b2ceb 2004-04-24 devnull if(t == s)
1292 8a3b2ceb 2004-04-24 devnull goto BadCoords;
1293 8a3b2ceb 2004-04-24 devnull /* degree sign etc. is optional */
1294 8a3b2ceb 2004-04-24 devnull chartorune(&c, t);
1295 8a3b2ceb 2004-04-24 devnull if(c == 0xb0)
1296 8a3b2ceb 2004-04-24 devnull deg = DEG(getra(s));
1297 8a3b2ceb 2004-04-24 devnull if(doreset)
1298 8a3b2ceb 2004-04-24 devnull reset();
1299 8a3b2ceb 2004-04-24 devnull if(abs(deg)>=90 || rah>=24)
1300 8a3b2ceb 2004-04-24 devnull goto BadCoords;
1301 8a3b2ceb 2004-04-24 devnull if(!loadpatch(patch(rah, ram, deg)))
1302 8a3b2ceb 2004-04-24 devnull goto NotFound;
1305 8a3b2ceb 2004-04-24 devnull default:
1306 8a3b2ceb 2004-04-24 devnull fprint(2, "unknown command %s\n", inputline);
1307 8a3b2ceb 2004-04-24 devnull return;
1311 8a3b2ceb 2004-04-24 devnull if(nrec == 0)
1312 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "empty\n");
1313 8a3b2ceb 2004-04-24 devnull else if(nrec <= 2)
1314 8a3b2ceb 2004-04-24 devnull for(i=0; i<nrec; i++)
1315 8a3b2ceb 2004-04-24 devnull prrec(rec+i);
1317 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%ld items\n", nrec);
1318 8a3b2ceb 2004-04-24 devnull return;
1320 8a3b2ceb 2004-04-24 devnull NotFound:
1321 8a3b2ceb 2004-04-24 devnull fprint(2, "%s not found\n", inputline);
1322 8a3b2ceb 2004-04-24 devnull return;
1325 8a3b2ceb 2004-04-24 devnull char *ngctypes[] =
1327 8a3b2ceb 2004-04-24 devnull [Galaxy] "Gx",
1328 8a3b2ceb 2004-04-24 devnull [PlanetaryN] "Pl",
1329 8a3b2ceb 2004-04-24 devnull [OpenCl] "OC",
1330 8a3b2ceb 2004-04-24 devnull [GlobularCl] "Gb",
1331 8a3b2ceb 2004-04-24 devnull [DiffuseN] "Nb",
1332 8a3b2ceb 2004-04-24 devnull [NebularCl] "C+N",
1333 8a3b2ceb 2004-04-24 devnull [Asterism] "Ast",
1334 8a3b2ceb 2004-04-24 devnull [Knot] "Kt",
1335 8a3b2ceb 2004-04-24 devnull [Triple] "***",
1336 8a3b2ceb 2004-04-24 devnull [Double] "D*",
1337 8a3b2ceb 2004-04-24 devnull [Single] "*",
1338 8a3b2ceb 2004-04-24 devnull [Uncertain] "?",
1339 8a3b2ceb 2004-04-24 devnull [Nonexistent] "-",
1340 8a3b2ceb 2004-04-24 devnull [Unknown] " ",
1341 cbeb0b26 2006-04-01 devnull [PlateDefect] "PD"
1345 8a3b2ceb 2004-04-24 devnull ngcstring(int d)
1347 8a3b2ceb 2004-04-24 devnull if(d<Galaxy || d>PlateDefect)
1348 8a3b2ceb 2004-04-24 devnull return "can't happen";
1349 8a3b2ceb 2004-04-24 devnull return ngctypes[d];
1352 8a3b2ceb 2004-04-24 devnull short descindex[NINDEX];
1355 8a3b2ceb 2004-04-24 devnull printnames(Record *r)
1357 8a3b2ceb 2004-04-24 devnull int i, ok, done;
1359 8a3b2ceb 2004-04-24 devnull done = 0;
1360 8a3b2ceb 2004-04-24 devnull for(i=0; i<NName; i++){ /* stupid linear search! */
1361 8a3b2ceb 2004-04-24 devnull ok = 0;
1362 8a3b2ceb 2004-04-24 devnull if(r->type==SAO && r->index==name[i].sao)
1363 8a3b2ceb 2004-04-24 devnull ok = 1;
1364 e9ad8994 2005-05-01 devnull if(r->type==NGC && r->u.ngc.ngc==name[i].ngc)
1365 8a3b2ceb 2004-04-24 devnull ok = 1;
1366 e9ad8994 2005-05-01 devnull if(r->type==Abell && r->u.abell.abell==name[i].abell)
1367 8a3b2ceb 2004-04-24 devnull ok = 1;
1368 8a3b2ceb 2004-04-24 devnull if(ok){
1369 8a3b2ceb 2004-04-24 devnull if(done++ == 0)
1370 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\t");
1371 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " \"%s\"", togreek(name[i].name));
1374 8a3b2ceb 2004-04-24 devnull if(done)
1375 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1379 8a3b2ceb 2004-04-24 devnull equal(char *s1, char *s2)
1383 8a3b2ceb 2004-04-24 devnull while(*s1){
1384 8a3b2ceb 2004-04-24 devnull if(*s1==' '){
1385 8a3b2ceb 2004-04-24 devnull while(*s1==' ')
1387 8a3b2ceb 2004-04-24 devnull continue;
1389 8a3b2ceb 2004-04-24 devnull while(*s2==' ')
1392 8a3b2ceb 2004-04-24 devnull if('A'<=*s2 && *s2<='Z')
1393 8a3b2ceb 2004-04-24 devnull c^=' ';
1394 8a3b2ceb 2004-04-24 devnull if(*s1!=c)
1395 8a3b2ceb 2004-04-24 devnull return 0;
1396 8a3b2ceb 2004-04-24 devnull s1++, s2++;
1398 8a3b2ceb 2004-04-24 devnull return 1;
1402 8a3b2ceb 2004-04-24 devnull parsename(char *s)
1404 8a3b2ceb 2004-04-24 devnull char *blank;
1407 8a3b2ceb 2004-04-24 devnull blank = strchr(s, ' ');
1408 8a3b2ceb 2004-04-24 devnull if(blank==0 || strchr(blank+1, ' ') || strlen(blank+1)!=3)
1409 8a3b2ceb 2004-04-24 devnull return 0;
1410 8a3b2ceb 2004-04-24 devnull blank++;
1411 8a3b2ceb 2004-04-24 devnull parsed[0] = parsed[1] = parsed[2] = 0;
1412 8a3b2ceb 2004-04-24 devnull if('0'<=s[0] && s[0]<='9'){
1413 8a3b2ceb 2004-04-24 devnull i = atoi(s);
1414 8a3b2ceb 2004-04-24 devnull parsed[0] = i;
1415 8a3b2ceb 2004-04-24 devnull if(i > 100)
1416 8a3b2ceb 2004-04-24 devnull return 0;
1418 8a3b2ceb 2004-04-24 devnull for(i=1; i<=24; i++)
1419 8a3b2ceb 2004-04-24 devnull if(strncmp(greek[i], s, strlen(greek[i]))==0){
1420 8a3b2ceb 2004-04-24 devnull parsed[0]=100+i;
1421 8a3b2ceb 2004-04-24 devnull goto out;
1423 8a3b2ceb 2004-04-24 devnull return 0;
1425 8a3b2ceb 2004-04-24 devnull if('0'<=s[strlen(greek[i])] && s[strlen(greek[i])]<='9')
1426 8a3b2ceb 2004-04-24 devnull parsed[1]=s[strlen(greek[i])]-'0';
1428 8a3b2ceb 2004-04-24 devnull for(i=1; i<=88; i++)
1429 8a3b2ceb 2004-04-24 devnull if(strcmp(constel[i], blank)==0){
1430 8a3b2ceb 2004-04-24 devnull parsed[2] = i;
1431 8a3b2ceb 2004-04-24 devnull return 1;
1433 8a3b2ceb 2004-04-24 devnull return 0;
1437 8a3b2ceb 2004-04-24 devnull dist_grp(int dg)
1439 8a3b2ceb 2004-04-24 devnull switch(dg){
1440 8a3b2ceb 2004-04-24 devnull default:
1441 8a3b2ceb 2004-04-24 devnull return "unknown";
1442 8a3b2ceb 2004-04-24 devnull case 1:
1443 8a3b2ceb 2004-04-24 devnull return "13.3-14.0";
1444 8a3b2ceb 2004-04-24 devnull case 2:
1445 8a3b2ceb 2004-04-24 devnull return "14.1-14.8";
1446 8a3b2ceb 2004-04-24 devnull case 3:
1447 8a3b2ceb 2004-04-24 devnull return "14.9-15.6";
1448 8a3b2ceb 2004-04-24 devnull case 4:
1449 8a3b2ceb 2004-04-24 devnull return "15.7-16.4";
1450 8a3b2ceb 2004-04-24 devnull case 5:
1451 8a3b2ceb 2004-04-24 devnull return "16.5-17.2";
1452 8a3b2ceb 2004-04-24 devnull case 6:
1453 8a3b2ceb 2004-04-24 devnull return "17.3-18.0";
1454 8a3b2ceb 2004-04-24 devnull case 7:
1455 8a3b2ceb 2004-04-24 devnull return ">18.0";
1460 8a3b2ceb 2004-04-24 devnull rich_grp(int dg)
1462 8a3b2ceb 2004-04-24 devnull switch(dg){
1463 8a3b2ceb 2004-04-24 devnull default:
1464 8a3b2ceb 2004-04-24 devnull return "unknown";
1465 8a3b2ceb 2004-04-24 devnull case 0:
1466 8a3b2ceb 2004-04-24 devnull return "30-40";
1467 8a3b2ceb 2004-04-24 devnull case 1:
1468 8a3b2ceb 2004-04-24 devnull return "50-79";
1469 8a3b2ceb 2004-04-24 devnull case 2:
1470 8a3b2ceb 2004-04-24 devnull return "80-129";
1471 8a3b2ceb 2004-04-24 devnull case 3:
1472 8a3b2ceb 2004-04-24 devnull return "130-199";
1473 8a3b2ceb 2004-04-24 devnull case 4:
1474 8a3b2ceb 2004-04-24 devnull return "200-299";
1475 8a3b2ceb 2004-04-24 devnull case 5:
1476 8a3b2ceb 2004-04-24 devnull return ">=300";
1481 8a3b2ceb 2004-04-24 devnull nameof(Record *r)
1483 8a3b2ceb 2004-04-24 devnull NGCrec *n;
1484 8a3b2ceb 2004-04-24 devnull SAOrec *s;
1485 8a3b2ceb 2004-04-24 devnull Abellrec *a;
1486 8a3b2ceb 2004-04-24 devnull static char buf[128];
1489 8a3b2ceb 2004-04-24 devnull switch(r->type){
1490 8a3b2ceb 2004-04-24 devnull default:
1491 8a3b2ceb 2004-04-24 devnull return nil;
1492 8a3b2ceb 2004-04-24 devnull case SAO:
1493 e9ad8994 2005-05-01 devnull s = &r->u.sao;
1494 8a3b2ceb 2004-04-24 devnull if(s->name[0] == 0)
1495 8a3b2ceb 2004-04-24 devnull return nil;
1496 8a3b2ceb 2004-04-24 devnull if(s->name[0] >= 100){
1497 8a3b2ceb 2004-04-24 devnull i = snprint(buf, sizeof buf, "%C", greeklet[s->name[0]-100]);
1498 8a3b2ceb 2004-04-24 devnull if(s->name[1])
1499 8a3b2ceb 2004-04-24 devnull i += snprint(buf+i, sizeof buf-i, "%d", s->name[1]);
1501 8a3b2ceb 2004-04-24 devnull i = snprint(buf, sizeof buf, " %d", s->name[0]);
1502 8a3b2ceb 2004-04-24 devnull snprint(buf+i, sizeof buf-i, " %s", constel[(uchar)s->name[2]]);
1504 8a3b2ceb 2004-04-24 devnull case NGC:
1505 e9ad8994 2005-05-01 devnull n = &r->u.ngc;
1506 8a3b2ceb 2004-04-24 devnull if(n->type >= Uncertain)
1507 8a3b2ceb 2004-04-24 devnull return nil;
1508 8a3b2ceb 2004-04-24 devnull if(n->ngc <= NNGC)
1509 8a3b2ceb 2004-04-24 devnull snprint(buf, sizeof buf, "NGC%4d ", n->ngc);
1511 8a3b2ceb 2004-04-24 devnull snprint(buf, sizeof buf, "IC%4d ", n->ngc-NNGC);
1513 8a3b2ceb 2004-04-24 devnull case Abell:
1514 e9ad8994 2005-05-01 devnull a = &r->u.abell;
1515 8a3b2ceb 2004-04-24 devnull snprint(buf, sizeof buf, "Abell%4d", a->abell);
1518 8a3b2ceb 2004-04-24 devnull return buf;
1522 8a3b2ceb 2004-04-24 devnull prrec(Record *r)
1524 8a3b2ceb 2004-04-24 devnull NGCrec *n;
1525 8a3b2ceb 2004-04-24 devnull SAOrec *s;
1526 8a3b2ceb 2004-04-24 devnull Abellrec *a;
1527 8a3b2ceb 2004-04-24 devnull Planetrec *p;
1528 8a3b2ceb 2004-04-24 devnull int i, rah, ram, dec, nn;
1529 8a3b2ceb 2004-04-24 devnull long key;
1531 8a3b2ceb 2004-04-24 devnull if(r) switch(r->type){
1532 8a3b2ceb 2004-04-24 devnull default:
1533 8a3b2ceb 2004-04-24 devnull fprint(2, "can't prrec type %d\n", r->type);
1534 8a3b2ceb 2004-04-24 devnull exits("type");
1536 8a3b2ceb 2004-04-24 devnull case Planet:
1537 e9ad8994 2005-05-01 devnull p = &r->u.planet;
1538 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s", p->name);
1539 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\t%s %s",
1540 8a3b2ceb 2004-04-24 devnull hms(angle(p->ra)),
1541 8a3b2ceb 2004-04-24 devnull dms(angle(p->dec)));
1542 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %3.2f° %3.2f°",
1543 8a3b2ceb 2004-04-24 devnull p->az/(double)MILLIARCSEC, p->alt/(double)MILLIARCSEC);
1544 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s",
1545 8a3b2ceb 2004-04-24 devnull ms(angle(p->semidiam)));
1546 8a3b2ceb 2004-04-24 devnull if(r->index <= 1)
1547 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %g", p->phase);
1548 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1551 8a3b2ceb 2004-04-24 devnull case NGC:
1552 e9ad8994 2005-05-01 devnull n = &r->u.ngc;
1553 8a3b2ceb 2004-04-24 devnull if(n->ngc <= NNGC)
1554 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "NGC%4d ", n->ngc);
1556 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "IC%4d ", n->ngc-NNGC);
1557 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%s ", ngcstring(n->type));
1558 8a3b2ceb 2004-04-24 devnull if(n->mag == UNKNOWNMAG)
1559 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "----");
1561 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%.1f%c", n->mag/10.0, n->magtype);
1562 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\t%s %s\t%c%.1f'\n",
1563 8a3b2ceb 2004-04-24 devnull hm(angle(n->ra)),
1564 8a3b2ceb 2004-04-24 devnull dm(angle(n->dec)),
1565 8a3b2ceb 2004-04-24 devnull n->diamlim,
1566 8a3b2ceb 2004-04-24 devnull DEG(angle(n->diam))*60.);
1567 8a3b2ceb 2004-04-24 devnull prdesc(n->desc, desctab, descindex);
1568 8a3b2ceb 2004-04-24 devnull printnames(r);
1571 8a3b2ceb 2004-04-24 devnull case Abell:
1572 e9ad8994 2005-05-01 devnull a = &r->u.abell;
1573 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "Abell%4d %.1f %.2f° %dMpc", a->abell, a->mag10/10.0,
1574 8a3b2ceb 2004-04-24 devnull DEG(angle(a->rad)), a->dist);
1575 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\t%s %s\t%.2f %.2f\n",
1576 8a3b2ceb 2004-04-24 devnull hm(angle(a->ra)),
1577 8a3b2ceb 2004-04-24 devnull dm(angle(a->dec)),
1578 8a3b2ceb 2004-04-24 devnull DEG(angle(a->glat)),
1579 8a3b2ceb 2004-04-24 devnull DEG(angle(a->glong)));
1580 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\tdist grp: %s rich grp: %s %d galaxies/°²\n",
1581 8a3b2ceb 2004-04-24 devnull dist_grp(a->distgrp),
1582 8a3b2ceb 2004-04-24 devnull rich_grp(a->richgrp),
1583 8a3b2ceb 2004-04-24 devnull a->pop);
1584 8a3b2ceb 2004-04-24 devnull printnames(r);
1587 8a3b2ceb 2004-04-24 devnull case SAO:
1588 e9ad8994 2005-05-01 devnull s = &r->u.sao;
1589 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "SAO%6ld ", r->index);
1590 8a3b2ceb 2004-04-24 devnull if(s->mag==UNKNOWNMAG)
1591 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "---");
1593 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%.1f", s->mag/10.0);
1594 8a3b2ceb 2004-04-24 devnull if(s->mpg==UNKNOWNMAG)
1595 8a3b2ceb 2004-04-24 devnull Bprint(&bout, ",---");
1597 8a3b2ceb 2004-04-24 devnull Bprint(&bout, ",%.1f", s->mpg/10.0);
1598 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s %s %.4fs %.3f\"",
1599 8a3b2ceb 2004-04-24 devnull hms(angle(s->ra)),
1600 8a3b2ceb 2004-04-24 devnull dms(angle(s->dec)),
1601 8a3b2ceb 2004-04-24 devnull DEG(angle(s->dra))*(4*60),
1602 8a3b2ceb 2004-04-24 devnull DEG(angle(s->ddec))*(60*60));
1603 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %.3s %c %.2s %ld %d",
1604 8a3b2ceb 2004-04-24 devnull s->spec, s->code, s->compid, s->hd, s->hdcode);
1605 8a3b2ceb 2004-04-24 devnull if(s->name[0])
1606 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " \"%s\"", nameof(r));
1607 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1608 8a3b2ceb 2004-04-24 devnull printnames(r);
1611 8a3b2ceb 2004-04-24 devnull case Patch:
1612 8a3b2ceb 2004-04-24 devnull radec(r->index, &rah, &ram, &dec);
1613 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%dh%dm %d°", rah, ram, dec);
1614 e9ad8994 2005-05-01 devnull key = r->u.patch.key[0];
1615 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s", constel[key&0xFF]);
1616 8a3b2ceb 2004-04-24 devnull if((key>>=8) & 0xFF)
1617 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s", constel[key&0xFF]);
1618 8a3b2ceb 2004-04-24 devnull if((key>>=8) & 0xFF)
1619 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s", constel[key&0xFF]);
1620 8a3b2ceb 2004-04-24 devnull if((key>>=8) & 0xFF)
1621 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " %s", constel[key&0xFF]);
1622 e9ad8994 2005-05-01 devnull for(i=1; i<r->u.patch.nkey; i++){
1623 e9ad8994 2005-05-01 devnull key = r->u.patch.key[i];
1624 8a3b2ceb 2004-04-24 devnull switch(key&0x3F){
1625 8a3b2ceb 2004-04-24 devnull case SAO:
1626 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " SAO%ld", (key>>8)&0xFFFFFF);
1628 8a3b2ceb 2004-04-24 devnull case Abell:
1629 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " Abell%ld", (key>>8)&0xFFFFFF);
1631 8a3b2ceb 2004-04-24 devnull default: /* NGC */
1632 8a3b2ceb 2004-04-24 devnull nn = (key>>16)&0xFFFF;
1633 8a3b2ceb 2004-04-24 devnull if(nn > NNGC)
1634 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " IC%d", nn-NNGC);
1636 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " NGC%d", nn);
1637 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "(%s)", ngcstring(key&0x3F));
1641 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1644 8a3b2ceb 2004-04-24 devnull case NGCN:
1645 8a3b2ceb 2004-04-24 devnull if(r->index <= NNGC)
1646 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "NGC%ld\n", r->index);
1648 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "IC%ld\n", r->index-NNGC);
1651 8a3b2ceb 2004-04-24 devnull case NamedSAO:
1652 e9ad8994 2005-05-01 devnull Bprint(&bout, "SAO%ld \"%s\"\n", r->index, togreek(r->u.named.name));
1655 8a3b2ceb 2004-04-24 devnull case NamedNGC:
1656 8a3b2ceb 2004-04-24 devnull if(r->index <= NNGC)
1657 e9ad8994 2005-05-01 devnull Bprint(&bout, "NGC%ld \"%s\"\n", r->index, togreek(r->u.named.name));
1659 e9ad8994 2005-05-01 devnull Bprint(&bout, "IC%ld \"%s\"\n", r->index-NNGC, togreek(r->u.named.name));
1662 8a3b2ceb 2004-04-24 devnull case NamedAbell:
1663 e9ad8994 2005-05-01 devnull Bprint(&bout, "Abell%ld \"%s\"\n", r->index, togreek(r->u.named.name));
1666 8a3b2ceb 2004-04-24 devnull case PatchC:
1667 8a3b2ceb 2004-04-24 devnull radec(r->index, &rah, &ram, &dec);
1668 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%dh%dm %d\n", rah, ram, dec);