Blame


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"
8 8a3b2ceb 2004-04-24 devnull
9 8a3b2ceb 2004-04-24 devnull enum
10 8a3b2ceb 2004-04-24 devnull {
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 */
23 8a3b2ceb 2004-04-24 devnull };
24 8a3b2ceb 2004-04-24 devnull
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 347aa646 2009-04-30 rsc int32 con[MAXcon];
30 8a3b2ceb 2004-04-24 devnull ushort conindex[Ncon+1];
31 347aa646 2009-04-30 rsc int32 patchaddr[Npatch+1];
32 8a3b2ceb 2004-04-24 devnull
33 8a3b2ceb 2004-04-24 devnull Record *rec;
34 8a3b2ceb 2004-04-24 devnull Record *orec;
35 8a3b2ceb 2004-04-24 devnull Record *cur;
36 8a3b2ceb 2004-04-24 devnull
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 347aa646 2009-04-30 rsc int32 nrec;
50 347aa646 2009-04-30 rsc int32 nreca;
51 347aa646 2009-04-30 rsc int32 norec;
52 347aa646 2009-04-30 rsc int32 noreca;
53 8a3b2ceb 2004-04-24 devnull
54 8a3b2ceb 2004-04-24 devnull Biobuf bin;
55 8a3b2ceb 2004-04-24 devnull Biobuf bout;
56 8a3b2ceb 2004-04-24 devnull
57 8a3b2ceb 2004-04-24 devnull void
58 8a3b2ceb 2004-04-24 devnull main(int argc, char *argv[])
59 8a3b2ceb 2004-04-24 devnull {
60 8a3b2ceb 2004-04-24 devnull char *line;
61 8a3b2ceb 2004-04-24 devnull
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);
72 8a3b2ceb 2004-04-24 devnull }
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)); */
77 8a3b2ceb 2004-04-24 devnull }
78 8a3b2ceb 2004-04-24 devnull return;
79 8a3b2ceb 2004-04-24 devnull }
80 8a3b2ceb 2004-04-24 devnull
81 8a3b2ceb 2004-04-24 devnull void
82 8a3b2ceb 2004-04-24 devnull reset(void)
83 8a3b2ceb 2004-04-24 devnull {
84 8a3b2ceb 2004-04-24 devnull nrec = 0;
85 8a3b2ceb 2004-04-24 devnull cur = rec;
86 8a3b2ceb 2004-04-24 devnull }
87 8a3b2ceb 2004-04-24 devnull
88 8a3b2ceb 2004-04-24 devnull void
89 8a3b2ceb 2004-04-24 devnull grow(void)
90 8a3b2ceb 2004-04-24 devnull {
91 8a3b2ceb 2004-04-24 devnull nrec++;
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");
98 8a3b2ceb 2004-04-24 devnull }
99 8a3b2ceb 2004-04-24 devnull }
100 8a3b2ceb 2004-04-24 devnull cur = rec+nrec-1;
101 8a3b2ceb 2004-04-24 devnull }
102 8a3b2ceb 2004-04-24 devnull
103 8a3b2ceb 2004-04-24 devnull void
104 8a3b2ceb 2004-04-24 devnull copy(void)
105 8a3b2ceb 2004-04-24 devnull {
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");
112 8a3b2ceb 2004-04-24 devnull }
113 8a3b2ceb 2004-04-24 devnull }
114 8a3b2ceb 2004-04-24 devnull memmove(orec, rec, nrec*sizeof(Record));
115 8a3b2ceb 2004-04-24 devnull norec = nrec;
116 8a3b2ceb 2004-04-24 devnull }
117 8a3b2ceb 2004-04-24 devnull
118 8a3b2ceb 2004-04-24 devnull int
119 8a3b2ceb 2004-04-24 devnull eopen(char *s)
120 8a3b2ceb 2004-04-24 devnull {
121 8a3b2ceb 2004-04-24 devnull char buf[128];
122 8a3b2ceb 2004-04-24 devnull int f;
123 8a3b2ceb 2004-04-24 devnull
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");
129 8a3b2ceb 2004-04-24 devnull }
130 8a3b2ceb 2004-04-24 devnull return f;
131 8a3b2ceb 2004-04-24 devnull }
132 8a3b2ceb 2004-04-24 devnull
133 8a3b2ceb 2004-04-24 devnull
134 8a3b2ceb 2004-04-24 devnull void
135 347aa646 2009-04-30 rsc Eread(int f, char *name, void *addr, int32 n)
136 8a3b2ceb 2004-04-24 devnull {
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");
140 8a3b2ceb 2004-04-24 devnull }
141 8a3b2ceb 2004-04-24 devnull }
142 8a3b2ceb 2004-04-24 devnull
143 8a3b2ceb 2004-04-24 devnull char*
144 8a3b2ceb 2004-04-24 devnull skipbl(char *s)
145 8a3b2ceb 2004-04-24 devnull {
146 8a3b2ceb 2004-04-24 devnull while(*s!=0 && (*s==' ' || *s=='\t'))
147 8a3b2ceb 2004-04-24 devnull s++;
148 8a3b2ceb 2004-04-24 devnull return s;
149 8a3b2ceb 2004-04-24 devnull }
150 8a3b2ceb 2004-04-24 devnull
151 8a3b2ceb 2004-04-24 devnull char*
152 8a3b2ceb 2004-04-24 devnull skipstr(char *s, char *t)
153 8a3b2ceb 2004-04-24 devnull {
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);
157 8a3b2ceb 2004-04-24 devnull }
158 8a3b2ceb 2004-04-24 devnull
159 347aa646 2009-04-30 rsc /* produce little-endian int32 at address l */
160 347aa646 2009-04-30 rsc int32
161 347aa646 2009-04-30 rsc Long(int32 *l)
162 8a3b2ceb 2004-04-24 devnull {
163 8a3b2ceb 2004-04-24 devnull uchar *p;
164 8a3b2ceb 2004-04-24 devnull
165 8a3b2ceb 2004-04-24 devnull p = (uchar*)l;
166 347aa646 2009-04-30 rsc return (int32)p[0]|((int32)p[1]<<8)|((int32)p[2]<<16)|((int32)p[3]<<24);
167 8a3b2ceb 2004-04-24 devnull }
168 8a3b2ceb 2004-04-24 devnull
169 347aa646 2009-04-30 rsc /* produce little-endian int32 at address l */
170 8a3b2ceb 2004-04-24 devnull int
171 8a3b2ceb 2004-04-24 devnull Short(short *s)
172 8a3b2ceb 2004-04-24 devnull {
173 8a3b2ceb 2004-04-24 devnull uchar *p;
174 8a3b2ceb 2004-04-24 devnull
175 8a3b2ceb 2004-04-24 devnull p = (uchar*)s;
176 8a3b2ceb 2004-04-24 devnull return p[0]|(p[1]<<8);
177 8a3b2ceb 2004-04-24 devnull }
178 8a3b2ceb 2004-04-24 devnull
179 8a3b2ceb 2004-04-24 devnull void
180 8a3b2ceb 2004-04-24 devnull nameopen(void)
181 8a3b2ceb 2004-04-24 devnull {
182 8a3b2ceb 2004-04-24 devnull Biobuf b;
183 8a3b2ceb 2004-04-24 devnull int i;
184 8a3b2ceb 2004-04-24 devnull char *l, *p;
185 8a3b2ceb 2004-04-24 devnull
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)
192 8a3b2ceb 2004-04-24 devnull break;
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);
197 8a3b2ceb 2004-04-24 devnull break;
198 8a3b2ceb 2004-04-24 devnull }
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);
209 8a3b2ceb 2004-04-24 devnull else
210 8a3b2ceb 2004-04-24 devnull goto Badformat;
211 8a3b2ceb 2004-04-24 devnull }
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);
215 8a3b2ceb 2004-04-24 devnull
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);
221 8a3b2ceb 2004-04-24 devnull }
222 8a3b2ceb 2004-04-24 devnull }
223 8a3b2ceb 2004-04-24 devnull
224 8a3b2ceb 2004-04-24 devnull void
225 8a3b2ceb 2004-04-24 devnull saoopen(void)
226 8a3b2ceb 2004-04-24 devnull {
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");
230 8a3b2ceb 2004-04-24 devnull }
231 8a3b2ceb 2004-04-24 devnull }
232 8a3b2ceb 2004-04-24 devnull
233 8a3b2ceb 2004-04-24 devnull void
234 8a3b2ceb 2004-04-24 devnull ngcopen(void)
235 8a3b2ceb 2004-04-24 devnull {
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);
242 8a3b2ceb 2004-04-24 devnull }
243 8a3b2ceb 2004-04-24 devnull }
244 8a3b2ceb 2004-04-24 devnull
245 8a3b2ceb 2004-04-24 devnull void
246 8a3b2ceb 2004-04-24 devnull abellopen(void)
247 8a3b2ceb 2004-04-24 devnull {
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");
251 8a3b2ceb 2004-04-24 devnull }
252 8a3b2ceb 2004-04-24 devnull
253 8a3b2ceb 2004-04-24 devnull void
254 8a3b2ceb 2004-04-24 devnull patchopen(void)
255 8a3b2ceb 2004-04-24 devnull {
256 8a3b2ceb 2004-04-24 devnull Biobuf *b;
257 347aa646 2009-04-30 rsc int32 l, m;
258 8a3b2ceb 2004-04-24 devnull char buf[100];
259 8a3b2ceb 2004-04-24 devnull
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");
267 8a3b2ceb 2004-04-24 devnull }
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);
271 8a3b2ceb 2004-04-24 devnull }
272 8a3b2ceb 2004-04-24 devnull }
273 8a3b2ceb 2004-04-24 devnull
274 8a3b2ceb 2004-04-24 devnull void
275 8a3b2ceb 2004-04-24 devnull mopen(void)
276 8a3b2ceb 2004-04-24 devnull {
277 8a3b2ceb 2004-04-24 devnull int i;
278 8a3b2ceb 2004-04-24 devnull
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);
285 8a3b2ceb 2004-04-24 devnull }
286 8a3b2ceb 2004-04-24 devnull }
287 8a3b2ceb 2004-04-24 devnull
288 8a3b2ceb 2004-04-24 devnull void
289 8a3b2ceb 2004-04-24 devnull constelopen(void)
290 8a3b2ceb 2004-04-24 devnull {
291 8a3b2ceb 2004-04-24 devnull int i;
292 8a3b2ceb 2004-04-24 devnull
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]);
300 8a3b2ceb 2004-04-24 devnull }
301 8a3b2ceb 2004-04-24 devnull }
302 8a3b2ceb 2004-04-24 devnull
303 8a3b2ceb 2004-04-24 devnull void
304 8a3b2ceb 2004-04-24 devnull lowercase(char *s)
305 8a3b2ceb 2004-04-24 devnull {
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';
309 8a3b2ceb 2004-04-24 devnull }
310 8a3b2ceb 2004-04-24 devnull
311 8a3b2ceb 2004-04-24 devnull int
312 347aa646 2009-04-30 rsc loadngc(int32 index)
313 8a3b2ceb 2004-04-24 devnull {
314 8a3b2ceb 2004-04-24 devnull static int failed;
315 347aa646 2009-04-30 rsc int32 j;
316 8a3b2ceb 2004-04-24 devnull
317 8a3b2ceb 2004-04-24 devnull ngcopen();
318 8a3b2ceb 2004-04-24 devnull j = (index-1)*sizeof(NGCrec);
319 8a3b2ceb 2004-04-24 devnull grow();
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++;
328 8a3b2ceb 2004-04-24 devnull }
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;
336 8a3b2ceb 2004-04-24 devnull }
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;
343 8a3b2ceb 2004-04-24 devnull }
344 8a3b2ceb 2004-04-24 devnull
345 8a3b2ceb 2004-04-24 devnull int
346 347aa646 2009-04-30 rsc loadabell(int32 index)
347 8a3b2ceb 2004-04-24 devnull {
348 347aa646 2009-04-30 rsc int32 j;
349 8a3b2ceb 2004-04-24 devnull
350 8a3b2ceb 2004-04-24 devnull abellopen();
351 8a3b2ceb 2004-04-24 devnull j = index-1;
352 8a3b2ceb 2004-04-24 devnull grow();
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");
361 8a3b2ceb 2004-04-24 devnull }
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;
371 8a3b2ceb 2004-04-24 devnull }
372 8a3b2ceb 2004-04-24 devnull
373 8a3b2ceb 2004-04-24 devnull int
374 8a3b2ceb 2004-04-24 devnull loadsao(int index)
375 8a3b2ceb 2004-04-24 devnull {
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();
379 8a3b2ceb 2004-04-24 devnull grow();
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;
392 8a3b2ceb 2004-04-24 devnull }
393 8a3b2ceb 2004-04-24 devnull
394 8a3b2ceb 2004-04-24 devnull int
395 8a3b2ceb 2004-04-24 devnull loadplanet(int index, Record *r)
396 8a3b2ceb 2004-04-24 devnull {
397 8a3b2ceb 2004-04-24 devnull if(index<0 || index>NPlanet || planet[index].name[0]=='\0')
398 8a3b2ceb 2004-04-24 devnull return 0;
399 8a3b2ceb 2004-04-24 devnull grow();
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));
405 8a3b2ceb 2004-04-24 devnull else
406 e9ad8994 2005-05-01 devnull memmove(&cur->u.planet, &r->u.planet, sizeof(Planetrec));
407 8a3b2ceb 2004-04-24 devnull return 1;
408 8a3b2ceb 2004-04-24 devnull }
409 8a3b2ceb 2004-04-24 devnull
410 8a3b2ceb 2004-04-24 devnull int
411 347aa646 2009-04-30 rsc loadpatch(int32 index)
412 8a3b2ceb 2004-04-24 devnull {
413 8a3b2ceb 2004-04-24 devnull int i;
414 8a3b2ceb 2004-04-24 devnull
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;
418 8a3b2ceb 2004-04-24 devnull grow();
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;
427 8a3b2ceb 2004-04-24 devnull }
428 8a3b2ceb 2004-04-24 devnull
429 8a3b2ceb 2004-04-24 devnull int
430 8a3b2ceb 2004-04-24 devnull loadtype(int t)
431 8a3b2ceb 2004-04-24 devnull {
432 8a3b2ceb 2004-04-24 devnull int i;
433 8a3b2ceb 2004-04-24 devnull
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])){
437 8a3b2ceb 2004-04-24 devnull grow();
438 8a3b2ceb 2004-04-24 devnull cur->type = NGCN;
439 8a3b2ceb 2004-04-24 devnull cur->index = i+1;
440 8a3b2ceb 2004-04-24 devnull }
441 8a3b2ceb 2004-04-24 devnull return 1;
442 8a3b2ceb 2004-04-24 devnull }
443 8a3b2ceb 2004-04-24 devnull
444 8a3b2ceb 2004-04-24 devnull void
445 8a3b2ceb 2004-04-24 devnull flatten(void)
446 8a3b2ceb 2004-04-24 devnull {
447 8a3b2ceb 2004-04-24 devnull int i, j, notflat;
448 8a3b2ceb 2004-04-24 devnull Record *or;
449 347aa646 2009-04-30 rsc int32 key;
450 8a3b2ceb 2004-04-24 devnull
451 8a3b2ceb 2004-04-24 devnull loop:
452 8a3b2ceb 2004-04-24 devnull copy();
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);
459 8a3b2ceb 2004-04-24 devnull break;
460 8a3b2ceb 2004-04-24 devnull
461 8a3b2ceb 2004-04-24 devnull case NONGC:
462 8a3b2ceb 2004-04-24 devnull break;
463 8a3b2ceb 2004-04-24 devnull
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:
468 8a3b2ceb 2004-04-24 devnull grow();
469 8a3b2ceb 2004-04-24 devnull memmove(cur, or, sizeof(Record));
470 8a3b2ceb 2004-04-24 devnull break;
471 8a3b2ceb 2004-04-24 devnull
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;
475 8a3b2ceb 2004-04-24 devnull break;
476 8a3b2ceb 2004-04-24 devnull
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;
480 8a3b2ceb 2004-04-24 devnull break;
481 8a3b2ceb 2004-04-24 devnull
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;
485 8a3b2ceb 2004-04-24 devnull break;
486 8a3b2ceb 2004-04-24 devnull
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;
490 8a3b2ceb 2004-04-24 devnull break;
491 8a3b2ceb 2004-04-24 devnull
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;
495 8a3b2ceb 2004-04-24 devnull break;
496 8a3b2ceb 2004-04-24 devnull
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);
504 8a3b2ceb 2004-04-24 devnull else
505 8a3b2ceb 2004-04-24 devnull loadngc((key>>16)&0xFFFF);
506 8a3b2ceb 2004-04-24 devnull }
507 8a3b2ceb 2004-04-24 devnull break;
508 8a3b2ceb 2004-04-24 devnull }
509 8a3b2ceb 2004-04-24 devnull }
510 8a3b2ceb 2004-04-24 devnull if(notflat)
511 8a3b2ceb 2004-04-24 devnull goto loop;
512 8a3b2ceb 2004-04-24 devnull }
513 8a3b2ceb 2004-04-24 devnull
514 8a3b2ceb 2004-04-24 devnull int
515 8a3b2ceb 2004-04-24 devnull ism(int index)
516 8a3b2ceb 2004-04-24 devnull {
517 8a3b2ceb 2004-04-24 devnull int i;
518 8a3b2ceb 2004-04-24 devnull
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;
523 8a3b2ceb 2004-04-24 devnull }
524 8a3b2ceb 2004-04-24 devnull
525 8a3b2ceb 2004-04-24 devnull char*
526 8a3b2ceb 2004-04-24 devnull alpha(char *s, char *t)
527 8a3b2ceb 2004-04-24 devnull {
528 8a3b2ceb 2004-04-24 devnull int n;
529 8a3b2ceb 2004-04-24 devnull
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;
534 fa325e9b 2020-01-10 cross
535 8a3b2ceb 2004-04-24 devnull }
536 8a3b2ceb 2004-04-24 devnull
537 8a3b2ceb 2004-04-24 devnull char*
538 8a3b2ceb 2004-04-24 devnull text(char *s, char *t)
539 8a3b2ceb 2004-04-24 devnull {
540 8a3b2ceb 2004-04-24 devnull int n;
541 8a3b2ceb 2004-04-24 devnull
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;
546 fa325e9b 2020-01-10 cross
547 8a3b2ceb 2004-04-24 devnull }
548 8a3b2ceb 2004-04-24 devnull
549 8a3b2ceb 2004-04-24 devnull int
550 8a3b2ceb 2004-04-24 devnull cull(char *s, int keep, int dobbox)
551 8a3b2ceb 2004-04-24 devnull {
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];
558 8a3b2ceb 2004-04-24 devnull
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;
577 8a3b2ceb 2004-04-24 devnull }
578 8a3b2ceb 2004-04-24 devnull s = skipbl(t);
579 8a3b2ceb 2004-04-24 devnull continue;
580 8a3b2ceb 2004-04-24 devnull }
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;
587 8a3b2ceb 2004-04-24 devnull }
588 8a3b2ceb 2004-04-24 devnull s = skipbl(t);
589 8a3b2ceb 2004-04-24 devnull continue;
590 8a3b2ceb 2004-04-24 devnull }
591 8a3b2ceb 2004-04-24 devnull if(t = text(s, "m")){
592 8a3b2ceb 2004-04-24 devnull dom = 1;
593 8a3b2ceb 2004-04-24 devnull s = t;
594 8a3b2ceb 2004-04-24 devnull continue;
595 8a3b2ceb 2004-04-24 devnull }
596 8a3b2ceb 2004-04-24 devnull if(t = text(s, "sao")){
597 8a3b2ceb 2004-04-24 devnull dosao = 1;
598 8a3b2ceb 2004-04-24 devnull s = t;
599 8a3b2ceb 2004-04-24 devnull continue;
600 8a3b2ceb 2004-04-24 devnull }
601 8a3b2ceb 2004-04-24 devnull if(t = text(s, "ngc")){
602 8a3b2ceb 2004-04-24 devnull dongc = 1;
603 8a3b2ceb 2004-04-24 devnull s = t;
604 8a3b2ceb 2004-04-24 devnull continue;
605 8a3b2ceb 2004-04-24 devnull }
606 8a3b2ceb 2004-04-24 devnull if(t = text(s, "abell")){
607 8a3b2ceb 2004-04-24 devnull doabell = 1;
608 8a3b2ceb 2004-04-24 devnull s = t;
609 8a3b2ceb 2004-04-24 devnull continue;
610 8a3b2ceb 2004-04-24 devnull }
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;
616 8a3b2ceb 2004-04-24 devnull }
617 8a3b2ceb 2004-04-24 devnull obj[nobj++] = names[i].type;
618 8a3b2ceb 2004-04-24 devnull s = t;
619 8a3b2ceb 2004-04-24 devnull goto Continue;
620 8a3b2ceb 2004-04-24 devnull }
621 8a3b2ceb 2004-04-24 devnull break;
622 8a3b2ceb 2004-04-24 devnull Continue:;
623 8a3b2ceb 2004-04-24 devnull }
624 8a3b2ceb 2004-04-24 devnull if(*s){
625 8a3b2ceb 2004-04-24 devnull fprint(2, "syntax error in object list\n");
626 8a3b2ceb 2004-04-24 devnull return 0;
627 8a3b2ceb 2004-04-24 devnull }
628 8a3b2ceb 2004-04-24 devnull
629 8a3b2ceb 2004-04-24 devnull Cull:
630 8a3b2ceb 2004-04-24 devnull flatten();
631 8a3b2ceb 2004-04-24 devnull copy();
632 8a3b2ceb 2004-04-24 devnull reset();
633 8a3b2ceb 2004-04-24 devnull if(dom)
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){
661 8a3b2ceb 2004-04-24 devnull grow();
662 8a3b2ceb 2004-04-24 devnull memmove(cur, or, sizeof(Record));
663 8a3b2ceb 2004-04-24 devnull }
664 8a3b2ceb 2004-04-24 devnull }
665 8a3b2ceb 2004-04-24 devnull return 1;
666 8a3b2ceb 2004-04-24 devnull }
667 8a3b2ceb 2004-04-24 devnull
668 8a3b2ceb 2004-04-24 devnull int
669 8a3b2ceb 2004-04-24 devnull compar(const void *va, const void *vb)
670 8a3b2ceb 2004-04-24 devnull {
671 8a3b2ceb 2004-04-24 devnull Record *a=(Record*)va, *b=(Record*)vb;
672 8a3b2ceb 2004-04-24 devnull
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;
676 8a3b2ceb 2004-04-24 devnull }
677 8a3b2ceb 2004-04-24 devnull
678 8a3b2ceb 2004-04-24 devnull void
679 8a3b2ceb 2004-04-24 devnull sort(void)
680 8a3b2ceb 2004-04-24 devnull {
681 8a3b2ceb 2004-04-24 devnull int i;
682 8a3b2ceb 2004-04-24 devnull Record *r, *s;
683 8a3b2ceb 2004-04-24 devnull
684 8a3b2ceb 2004-04-24 devnull if(nrec == 0)
685 8a3b2ceb 2004-04-24 devnull return;
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));
694 8a3b2ceb 2004-04-24 devnull }
695 8a3b2ceb 2004-04-24 devnull nrec = (s+1)-rec;
696 8a3b2ceb 2004-04-24 devnull }
697 8a3b2ceb 2004-04-24 devnull
698 8a3b2ceb 2004-04-24 devnull char greekbuf[128];
699 8a3b2ceb 2004-04-24 devnull
700 8a3b2ceb 2004-04-24 devnull char*
701 8a3b2ceb 2004-04-24 devnull togreek(char *s)
702 8a3b2ceb 2004-04-24 devnull {
703 8a3b2ceb 2004-04-24 devnull char *t;
704 8a3b2ceb 2004-04-24 devnull int i, n;
705 8a3b2ceb 2004-04-24 devnull Rune r;
706 8a3b2ceb 2004-04-24 devnull
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')){
712 8a3b2ceb 2004-04-24 devnull s += n;
713 8a3b2ceb 2004-04-24 devnull t += runetochar(t, &greeklet[i]);
714 8a3b2ceb 2004-04-24 devnull goto Cont;
715 8a3b2ceb 2004-04-24 devnull }
716 8a3b2ceb 2004-04-24 devnull }
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++;
720 8a3b2ceb 2004-04-24 devnull Cont:;
721 8a3b2ceb 2004-04-24 devnull }
722 8a3b2ceb 2004-04-24 devnull *t = 0;
723 8a3b2ceb 2004-04-24 devnull return greekbuf;
724 8a3b2ceb 2004-04-24 devnull }
725 8a3b2ceb 2004-04-24 devnull
726 8a3b2ceb 2004-04-24 devnull char*
727 8a3b2ceb 2004-04-24 devnull fromgreek(char *s)
728 8a3b2ceb 2004-04-24 devnull {
729 8a3b2ceb 2004-04-24 devnull char *t;
730 8a3b2ceb 2004-04-24 devnull int i, n;
731 8a3b2ceb 2004-04-24 devnull Rune r;
732 8a3b2ceb 2004-04-24 devnull
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]);
740 8a3b2ceb 2004-04-24 devnull s += n;
741 8a3b2ceb 2004-04-24 devnull goto Cont;
742 8a3b2ceb 2004-04-24 devnull }
743 8a3b2ceb 2004-04-24 devnull }
744 8a3b2ceb 2004-04-24 devnull for(i=0; i<n; i++)
745 8a3b2ceb 2004-04-24 devnull *t++ = *s++;
746 8a3b2ceb 2004-04-24 devnull Cont:;
747 8a3b2ceb 2004-04-24 devnull }
748 8a3b2ceb 2004-04-24 devnull *t = 0;
749 8a3b2ceb 2004-04-24 devnull return greekbuf;
750 8a3b2ceb 2004-04-24 devnull }
751 8a3b2ceb 2004-04-24 devnull
752 8a3b2ceb 2004-04-24 devnull #ifdef OLD
753 8a3b2ceb 2004-04-24 devnull /*
754 8a3b2ceb 2004-04-24 devnull * Old version
755 8a3b2ceb 2004-04-24 devnull */
756 8a3b2ceb 2004-04-24 devnull int
757 8a3b2ceb 2004-04-24 devnull coords(int deg)
758 8a3b2ceb 2004-04-24 devnull {
759 8a3b2ceb 2004-04-24 devnull int i;
760 8a3b2ceb 2004-04-24 devnull int x, y;
761 8a3b2ceb 2004-04-24 devnull Record *or;
762 347aa646 2009-04-30 rsc int32 dec, ra, ndec, nra;
763 8a3b2ceb 2004-04-24 devnull int rdeg;
764 8a3b2ceb 2004-04-24 devnull
765 8a3b2ceb 2004-04-24 devnull flatten();
766 8a3b2ceb 2004-04-24 devnull copy();
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;
782 8a3b2ceb 2004-04-24 devnull else
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)));
793 8a3b2ceb 2004-04-24 devnull }
794 8a3b2ceb 2004-04-24 devnull }
795 8a3b2ceb 2004-04-24 devnull }
796 8a3b2ceb 2004-04-24 devnull sort();
797 8a3b2ceb 2004-04-24 devnull return 1;
798 8a3b2ceb 2004-04-24 devnull }
799 8a3b2ceb 2004-04-24 devnull #endif
800 8a3b2ceb 2004-04-24 devnull
801 8a3b2ceb 2004-04-24 devnull /*
802 8a3b2ceb 2004-04-24 devnull * New version attempts to match the boundaries of the plot better.
803 8a3b2ceb 2004-04-24 devnull */
804 8a3b2ceb 2004-04-24 devnull int
805 8a3b2ceb 2004-04-24 devnull coords(int deg)
806 8a3b2ceb 2004-04-24 devnull {
807 8a3b2ceb 2004-04-24 devnull int i;
808 8a3b2ceb 2004-04-24 devnull int x, y, xx;
809 8a3b2ceb 2004-04-24 devnull Record *or;
810 347aa646 2009-04-30 rsc int32 min, circle;
811 8a3b2ceb 2004-04-24 devnull double factor;
812 8a3b2ceb 2004-04-24 devnull
813 8a3b2ceb 2004-04-24 devnull flatten();
814 8a3b2ceb 2004-04-24 devnull circle = 360*MILLIARCSEC;
815 8a3b2ceb 2004-04-24 devnull deg *= MILLIARCSEC;
816 8a3b2ceb 2004-04-24 devnull
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)));
831 8a3b2ceb 2004-04-24 devnull copy();
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){
840 8a3b2ceb 2004-04-24 devnull xx = x;
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)));
846 8a3b2ceb 2004-04-24 devnull }
847 8a3b2ceb 2004-04-24 devnull sort();
848 8a3b2ceb 2004-04-24 devnull cull(nil, 1, 1);
849 8a3b2ceb 2004-04-24 devnull return 1;
850 8a3b2ceb 2004-04-24 devnull }
851 8a3b2ceb 2004-04-24 devnull
852 8a3b2ceb 2004-04-24 devnull void
853 8a3b2ceb 2004-04-24 devnull pplate(char *flags)
854 8a3b2ceb 2004-04-24 devnull {
855 8a3b2ceb 2004-04-24 devnull int i;
856 347aa646 2009-04-30 rsc int32 c;
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 347aa646 2009-04-30 rsc int32 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;
865 8a3b2ceb 2004-04-24 devnull
866 8a3b2ceb 2004-04-24 devnull rasize = -1.0;
867 8a3b2ceb 2004-04-24 devnull decsize = -1.0;
868 8a3b2ceb 2004-04-24 devnull na = 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;
879 8a3b2ceb 2004-04-24 devnull }
880 8a3b2ceb 2004-04-24 devnull if(*flags){
881 8a3b2ceb 2004-04-24 devnull err:
882 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "syntax error in plate\n");
883 8a3b2ceb 2004-04-24 devnull return;
884 8a3b2ceb 2004-04-24 devnull }
885 8a3b2ceb 2004-04-24 devnull break;
886 8a3b2ceb 2004-04-24 devnull }
887 8a3b2ceb 2004-04-24 devnull switch(na){
888 8a3b2ceb 2004-04-24 devnull case 0:
889 8a3b2ceb 2004-04-24 devnull break;
890 8a3b2ceb 2004-04-24 devnull case 1:
891 8a3b2ceb 2004-04-24 devnull rasize = a[0];
892 8a3b2ceb 2004-04-24 devnull decsize = rasize;
893 8a3b2ceb 2004-04-24 devnull break;
894 8a3b2ceb 2004-04-24 devnull case 2:
895 8a3b2ceb 2004-04-24 devnull rasize = a[0];
896 8a3b2ceb 2004-04-24 devnull decsize = a[1];
897 8a3b2ceb 2004-04-24 devnull break;
898 8a3b2ceb 2004-04-24 devnull case 3:
899 8a3b2ceb 2004-04-24 devnull case 4:
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];
905 8a3b2ceb 2004-04-24 devnull else
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");
909 8a3b2ceb 2004-04-24 devnull return;
910 8a3b2ceb 2004-04-24 devnull }
911 8a3b2ceb 2004-04-24 devnull goto done;
912 8a3b2ceb 2004-04-24 devnull }
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;
916 8a3b2ceb 2004-04-24 devnull Again:
917 8a3b2ceb 2004-04-24 devnull if(nrec == 0){
918 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "empty\n");
919 8a3b2ceb 2004-04-24 devnull return;
920 8a3b2ceb 2004-04-24 devnull }
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;
936 8a3b2ceb 2004-04-24 devnull else
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;
954 8a3b2ceb 2004-04-24 devnull }else
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;
964 8a3b2ceb 2004-04-24 devnull }
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;
969 8a3b2ceb 2004-04-24 devnull }
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;
973 8a3b2ceb 2004-04-24 devnull }
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);
979 8a3b2ceb 2004-04-24 devnull }
980 8a3b2ceb 2004-04-24 devnull done:
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);
987 8a3b2ceb 2004-04-24 devnull }
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)
995 8a3b2ceb 2004-04-24 devnull return;
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);
999 8a3b2ceb 2004-04-24 devnull }
1000 8a3b2ceb 2004-04-24 devnull
1001 8a3b2ceb 2004-04-24 devnull void
1002 8a3b2ceb 2004-04-24 devnull lookup(char *s, int doreset)
1003 8a3b2ceb 2004-04-24 devnull {
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 347aa646 2009-04-30 rsc int32 n;
1010 8a3b2ceb 2004-04-24 devnull double x;
1011 8a3b2ceb 2004-04-24 devnull Angle ra;
1012 8a3b2ceb 2004-04-24 devnull
1013 8a3b2ceb 2004-04-24 devnull lowercase(s);
1014 8a3b2ceb 2004-04-24 devnull s = skipbl(s);
1015 8a3b2ceb 2004-04-24 devnull
1016 8a3b2ceb 2004-04-24 devnull if(*s == 0)
1017 8a3b2ceb 2004-04-24 devnull goto Print;
1018 8a3b2ceb 2004-04-24 devnull
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;
1023 8a3b2ceb 2004-04-24 devnull }
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;
1027 8a3b2ceb 2004-04-24 devnull }
1028 8a3b2ceb 2004-04-24 devnull flatten();
1029 8a3b2ceb 2004-04-24 devnull goto Print;
1030 8a3b2ceb 2004-04-24 devnull }
1031 8a3b2ceb 2004-04-24 devnull
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;
1036 8a3b2ceb 2004-04-24 devnull }
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;
1040 8a3b2ceb 2004-04-24 devnull }
1041 8a3b2ceb 2004-04-24 devnull
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;
1045 8a3b2ceb 2004-04-24 devnull }
1046 8a3b2ceb 2004-04-24 devnull
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;
1055 8a3b2ceb 2004-04-24 devnull }
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;
1061 8a3b2ceb 2004-04-24 devnull }
1062 8a3b2ceb 2004-04-24 devnull
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;
1071 8a3b2ceb 2004-04-24 devnull }
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;
1077 8a3b2ceb 2004-04-24 devnull }
1078 8a3b2ceb 2004-04-24 devnull
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;
1087 8a3b2ceb 2004-04-24 devnull }
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;
1093 8a3b2ceb 2004-04-24 devnull }
1094 8a3b2ceb 2004-04-24 devnull
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;
1104 8a3b2ceb 2004-04-24 devnull }
1105 8a3b2ceb 2004-04-24 devnull
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++)
1112 8a3b2ceb 2004-04-24 devnull ;
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;
1120 8a3b2ceb 2004-04-24 devnull }
1121 8a3b2ceb 2004-04-24 devnull j++;
1122 8a3b2ceb 2004-04-24 devnull }
1123 8a3b2ceb 2004-04-24 devnull goto Print;
1124 8a3b2ceb 2004-04-24 devnull }
1125 8a3b2ceb 2004-04-24 devnull
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;
1131 8a3b2ceb 2004-04-24 devnull }
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]);
1142 8a3b2ceb 2004-04-24 devnull }
1143 8a3b2ceb 2004-04-24 devnull goto Print;
1144 8a3b2ceb 2004-04-24 devnull }
1145 8a3b2ceb 2004-04-24 devnull
1146 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "expand")){
1147 8a3b2ceb 2004-04-24 devnull n = 0;
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;
1153 8a3b2ceb 2004-04-24 devnull }
1154 8a3b2ceb 2004-04-24 devnull n = strtoul(t, &u, 10);
1155 8a3b2ceb 2004-04-24 devnull t = skipbl(u);
1156 8a3b2ceb 2004-04-24 devnull if(*t)
1157 8a3b2ceb 2004-04-24 devnull goto Expanderr;
1158 8a3b2ceb 2004-04-24 devnull }
1159 8a3b2ceb 2004-04-24 devnull coords(n);
1160 8a3b2ceb 2004-04-24 devnull goto Print;
1161 8a3b2ceb 2004-04-24 devnull }
1162 8a3b2ceb 2004-04-24 devnull
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;
1167 8a3b2ceb 2004-04-24 devnull }
1168 8a3b2ceb 2004-04-24 devnull plot(t);
1169 8a3b2ceb 2004-04-24 devnull return;
1170 8a3b2ceb 2004-04-24 devnull }
1171 8a3b2ceb 2004-04-24 devnull
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;
1175 8a3b2ceb 2004-04-24 devnull }
1176 8a3b2ceb 2004-04-24 devnull
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;
1180 8a3b2ceb 2004-04-24 devnull }
1181 8a3b2ceb 2004-04-24 devnull
1182 8a3b2ceb 2004-04-24 devnull if(t = alpha(s, "gamma")){
1183 8a3b2ceb 2004-04-24 devnull while(*t==' ')
1184 8a3b2ceb 2004-04-24 devnull t++;
1185 8a3b2ceb 2004-04-24 devnull u = 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;
1191 8a3b2ceb 2004-04-24 devnull }
1192 8a3b2ceb 2004-04-24 devnull
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;
1197 8a3b2ceb 2004-04-24 devnull }
1198 8a3b2ceb 2004-04-24 devnull
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;
1203 8a3b2ceb 2004-04-24 devnull }
1204 8a3b2ceb 2004-04-24 devnull
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;
1211 8a3b2ceb 2004-04-24 devnull }
1212 8a3b2ceb 2004-04-24 devnull }
1213 8a3b2ceb 2004-04-24 devnull
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;
1219 8a3b2ceb 2004-04-24 devnull }
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;
1224 8a3b2ceb 2004-04-24 devnull }
1225 8a3b2ceb 2004-04-24 devnull }
1226 8a3b2ceb 2004-04-24 devnull
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;
1234 8a3b2ceb 2004-04-24 devnull }
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;
1247 8a3b2ceb 2004-04-24 devnull }
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;
1251 8a3b2ceb 2004-04-24 devnull }
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;
1255 8a3b2ceb 2004-04-24 devnull }
1256 e9ad8994 2005-05-01 devnull strcpy(rec[j].u.named.name, name[i].name);
1257 8a3b2ceb 2004-04-24 devnull j++;
1258 8a3b2ceb 2004-04-24 devnull }
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));
1268 8a3b2ceb 2004-04-24 devnull j++;
1269 8a3b2ceb 2004-04-24 devnull }
1270 8a3b2ceb 2004-04-24 devnull if(j == 0){
1271 8a3b2ceb 2004-04-24 devnull *s = '"';
1272 8a3b2ceb 2004-04-24 devnull goto NotFound;
1273 8a3b2ceb 2004-04-24 devnull }
1274 8a3b2ceb 2004-04-24 devnull break;
1275 8a3b2ceb 2004-04-24 devnull
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);
1282 8a3b2ceb 2004-04-24 devnull break;
1283 8a3b2ceb 2004-04-24 devnull }
1284 8a3b2ceb 2004-04-24 devnull ra = DEG(getra(s));
1285 8a3b2ceb 2004-04-24 devnull while(*s && *s!=' ' && *s!='\t')
1286 8a3b2ceb 2004-04-24 devnull s++;
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;
1303 8a3b2ceb 2004-04-24 devnull break;
1304 8a3b2ceb 2004-04-24 devnull
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;
1308 8a3b2ceb 2004-04-24 devnull }
1309 8a3b2ceb 2004-04-24 devnull
1310 8a3b2ceb 2004-04-24 devnull Print:
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);
1316 8a3b2ceb 2004-04-24 devnull else
1317 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "%ld items\n", nrec);
1318 8a3b2ceb 2004-04-24 devnull return;
1319 8a3b2ceb 2004-04-24 devnull
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;
1323 8a3b2ceb 2004-04-24 devnull }
1324 8a3b2ceb 2004-04-24 devnull
1325 8a3b2ceb 2004-04-24 devnull char *ngctypes[] =
1326 8a3b2ceb 2004-04-24 devnull {
1327 af0dea45 2011-05-17 rsc [Galaxy] = "Gx",
1328 af0dea45 2011-05-17 rsc [PlanetaryN] = "Pl",
1329 af0dea45 2011-05-17 rsc [OpenCl] = "OC",
1330 af0dea45 2011-05-17 rsc [GlobularCl] = "Gb",
1331 af0dea45 2011-05-17 rsc [DiffuseN] = "Nb",
1332 af0dea45 2011-05-17 rsc [NebularCl] = "C+N",
1333 af0dea45 2011-05-17 rsc [Asterism] = "Ast",
1334 af0dea45 2011-05-17 rsc [Knot] = "Kt",
1335 af0dea45 2011-05-17 rsc [Triple] = "***",
1336 af0dea45 2011-05-17 rsc [Double] = "D*",
1337 af0dea45 2011-05-17 rsc [Single] = "*",
1338 af0dea45 2011-05-17 rsc [Uncertain] = "?",
1339 af0dea45 2011-05-17 rsc [Nonexistent] = "-",
1340 af0dea45 2011-05-17 rsc [Unknown] = " ",
1341 af0dea45 2011-05-17 rsc [PlateDefect] = "PD"
1342 8a3b2ceb 2004-04-24 devnull };
1343 8a3b2ceb 2004-04-24 devnull
1344 8a3b2ceb 2004-04-24 devnull char*
1345 8a3b2ceb 2004-04-24 devnull ngcstring(int d)
1346 8a3b2ceb 2004-04-24 devnull {
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];
1350 8a3b2ceb 2004-04-24 devnull }
1351 8a3b2ceb 2004-04-24 devnull
1352 8a3b2ceb 2004-04-24 devnull short descindex[NINDEX];
1353 8a3b2ceb 2004-04-24 devnull
1354 8a3b2ceb 2004-04-24 devnull void
1355 8a3b2ceb 2004-04-24 devnull printnames(Record *r)
1356 8a3b2ceb 2004-04-24 devnull {
1357 8a3b2ceb 2004-04-24 devnull int i, ok, done;
1358 8a3b2ceb 2004-04-24 devnull
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));
1372 8a3b2ceb 2004-04-24 devnull }
1373 8a3b2ceb 2004-04-24 devnull }
1374 8a3b2ceb 2004-04-24 devnull if(done)
1375 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1376 8a3b2ceb 2004-04-24 devnull }
1377 8a3b2ceb 2004-04-24 devnull
1378 8a3b2ceb 2004-04-24 devnull int
1379 8a3b2ceb 2004-04-24 devnull equal(char *s1, char *s2)
1380 8a3b2ceb 2004-04-24 devnull {
1381 8a3b2ceb 2004-04-24 devnull int c;
1382 8a3b2ceb 2004-04-24 devnull
1383 8a3b2ceb 2004-04-24 devnull while(*s1){
1384 8a3b2ceb 2004-04-24 devnull if(*s1==' '){
1385 8a3b2ceb 2004-04-24 devnull while(*s1==' ')
1386 8a3b2ceb 2004-04-24 devnull s1++;
1387 8a3b2ceb 2004-04-24 devnull continue;
1388 8a3b2ceb 2004-04-24 devnull }
1389 8a3b2ceb 2004-04-24 devnull while(*s2==' ')
1390 8a3b2ceb 2004-04-24 devnull s2++;
1391 8a3b2ceb 2004-04-24 devnull c=*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++;
1397 8a3b2ceb 2004-04-24 devnull }
1398 8a3b2ceb 2004-04-24 devnull return 1;
1399 8a3b2ceb 2004-04-24 devnull }
1400 8a3b2ceb 2004-04-24 devnull
1401 8a3b2ceb 2004-04-24 devnull int
1402 8a3b2ceb 2004-04-24 devnull parsename(char *s)
1403 8a3b2ceb 2004-04-24 devnull {
1404 8a3b2ceb 2004-04-24 devnull char *blank;
1405 8a3b2ceb 2004-04-24 devnull int i;
1406 8a3b2ceb 2004-04-24 devnull
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;
1417 8a3b2ceb 2004-04-24 devnull }else{
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;
1422 8a3b2ceb 2004-04-24 devnull }
1423 8a3b2ceb 2004-04-24 devnull return 0;
1424 8a3b2ceb 2004-04-24 devnull out:
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';
1427 8a3b2ceb 2004-04-24 devnull }
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;
1432 8a3b2ceb 2004-04-24 devnull }
1433 8a3b2ceb 2004-04-24 devnull return 0;
1434 8a3b2ceb 2004-04-24 devnull }
1435 8a3b2ceb 2004-04-24 devnull
1436 8a3b2ceb 2004-04-24 devnull char*
1437 8a3b2ceb 2004-04-24 devnull dist_grp(int dg)
1438 8a3b2ceb 2004-04-24 devnull {
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";
1456 8a3b2ceb 2004-04-24 devnull }
1457 8a3b2ceb 2004-04-24 devnull }
1458 8a3b2ceb 2004-04-24 devnull
1459 8a3b2ceb 2004-04-24 devnull char*
1460 8a3b2ceb 2004-04-24 devnull rich_grp(int dg)
1461 8a3b2ceb 2004-04-24 devnull {
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";
1477 8a3b2ceb 2004-04-24 devnull }
1478 8a3b2ceb 2004-04-24 devnull }
1479 8a3b2ceb 2004-04-24 devnull
1480 8a3b2ceb 2004-04-24 devnull char*
1481 8a3b2ceb 2004-04-24 devnull nameof(Record *r)
1482 8a3b2ceb 2004-04-24 devnull {
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];
1487 8a3b2ceb 2004-04-24 devnull int i;
1488 8a3b2ceb 2004-04-24 devnull
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]);
1500 8a3b2ceb 2004-04-24 devnull }else
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]]);
1503 8a3b2ceb 2004-04-24 devnull break;
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);
1510 8a3b2ceb 2004-04-24 devnull else
1511 8a3b2ceb 2004-04-24 devnull snprint(buf, sizeof buf, "IC%4d ", n->ngc-NNGC);
1512 8a3b2ceb 2004-04-24 devnull break;
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);
1516 8a3b2ceb 2004-04-24 devnull break;
1517 8a3b2ceb 2004-04-24 devnull }
1518 8a3b2ceb 2004-04-24 devnull return buf;
1519 8a3b2ceb 2004-04-24 devnull }
1520 8a3b2ceb 2004-04-24 devnull
1521 8a3b2ceb 2004-04-24 devnull void
1522 8a3b2ceb 2004-04-24 devnull prrec(Record *r)
1523 8a3b2ceb 2004-04-24 devnull {
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 347aa646 2009-04-30 rsc int32 key;
1530 8a3b2ceb 2004-04-24 devnull
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");
1535 8a3b2ceb 2004-04-24 devnull
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");
1549 8a3b2ceb 2004-04-24 devnull break;
1550 8a3b2ceb 2004-04-24 devnull
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);
1555 8a3b2ceb 2004-04-24 devnull else
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, "----");
1560 8a3b2ceb 2004-04-24 devnull else
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);
1569 8a3b2ceb 2004-04-24 devnull break;
1570 8a3b2ceb 2004-04-24 devnull
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);
1585 8a3b2ceb 2004-04-24 devnull break;
1586 8a3b2ceb 2004-04-24 devnull
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, "---");
1592 8a3b2ceb 2004-04-24 devnull else
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, ",---");
1596 8a3b2ceb 2004-04-24 devnull else
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);
1609 8a3b2ceb 2004-04-24 devnull break;
1610 8a3b2ceb 2004-04-24 devnull
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);
1627 8a3b2ceb 2004-04-24 devnull break;
1628 8a3b2ceb 2004-04-24 devnull case Abell:
1629 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " Abell%ld", (key>>8)&0xFFFFFF);
1630 8a3b2ceb 2004-04-24 devnull break;
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);
1635 8a3b2ceb 2004-04-24 devnull else
1636 8a3b2ceb 2004-04-24 devnull Bprint(&bout, " NGC%d", nn);
1637 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "(%s)", ngcstring(key&0x3F));
1638 8a3b2ceb 2004-04-24 devnull break;
1639 8a3b2ceb 2004-04-24 devnull }
1640 8a3b2ceb 2004-04-24 devnull }
1641 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\n");
1642 8a3b2ceb 2004-04-24 devnull break;
1643 8a3b2ceb 2004-04-24 devnull
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);
1647 8a3b2ceb 2004-04-24 devnull else
1648 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "IC%ld\n", r->index-NNGC);
1649 8a3b2ceb 2004-04-24 devnull break;
1650 8a3b2ceb 2004-04-24 devnull
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));
1653 8a3b2ceb 2004-04-24 devnull break;
1654 8a3b2ceb 2004-04-24 devnull
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));
1658 8a3b2ceb 2004-04-24 devnull else
1659 e9ad8994 2005-05-01 devnull Bprint(&bout, "IC%ld \"%s\"\n", r->index-NNGC, togreek(r->u.named.name));
1660 8a3b2ceb 2004-04-24 devnull break;
1661 8a3b2ceb 2004-04-24 devnull
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));
1664 8a3b2ceb 2004-04-24 devnull break;
1665 8a3b2ceb 2004-04-24 devnull
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);
1669 8a3b2ceb 2004-04-24 devnull break;
1670 8a3b2ceb 2004-04-24 devnull }
1671 8a3b2ceb 2004-04-24 devnull }