1 
2 #define DIR	"#9/sky"
3 /*
4  *	This code reflects many years of changes.  There remain residues
5  *		of prior implementations.
6  *
7  *	Keys:
8  *		32 bits long. High 26 bits are encoded as described below.
9  *		Low 6 bits are types:
10  *
11  *		Patch is ~ one square degree of sky.  It points to an otherwise
12  *			anonymous list of Catalog keys.  The 0th key is special:
13  *			it contains up to 4 constellation identifiers.
14  *		Catalogs (SAO,NGC,M,...) are:
15  *			31.........8|76|543210
16  *			  catalog # |BB|catalog name
17  *			BB is two bits of brightness:
18  *				00	-inf <  m <=  7
19  *				01	   7 <  m <= 10
20  *				10	  10 <  m <= 13
21  *				11	  13 <  m <  inf
22  *			The BB field is a dreg, and correct only for SAO and NGC.
23  *			IC(n) is just NGC(n+7840)
24  *		Others should be self-explanatory.
25  *
26  *	Records:
27  *
28  *	Star is an SAOrec
29  *	Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, etc., are NGCrecs.
30  *	Abell is an Abellrec
31  *	The Namedxxx records hold a name and a catalog entry; they result from
32  *		name lookups.
33  */
34 
35 typedef enum
36 {
37 	Planet,
38 	Patch,
39 	SAO,
40 	NGC,
41 	M,
42 	Constel_deprecated,
43 	Nonstar_deprecated,
44 	NamedSAO,
45 	NamedNGC,
46 	NamedAbell,
47 	Abell,
48 	/* NGC types */
49 	Galaxy,
50 	PlanetaryN,
51 	OpenCl,
52 	GlobularCl,
53 	DiffuseN,
54 	NebularCl,
55 	Asterism,
56 	Knot,
57 	Triple,
58 	Double,
59 	Single,
60 	Uncertain,
61 	Nonexistent,
62 	Unknown,
63 	PlateDefect,
64 	/* internal */
65 	NGCN,
66 	PatchC,
67 	NONGC
68 }Type;
69 
70 enum
71 {
72 	/*
73 	 * parameters for plate
74 	 */
75 	Pppo1	= 0,
76 	Pppo2,
77 	Pppo3,
78 	Pppo4,
79 	Pppo5,
80 	Pppo6,
81 	Pamdx1,
82 	Pamdx2,
83 	Pamdx3,
84 	Pamdx4,
85 	Pamdx5,
86 	Pamdx6,
87 	Pamdx7,
88 	Pamdx8,
89 	Pamdx9,
90 	Pamdx10,
91 	Pamdx11,
92 	Pamdx12,
93 	Pamdx13,
94 	Pamdx14,
95 	Pamdx15,
96 	Pamdx16,
97 	Pamdx17,
98 	Pamdx18,
99 	Pamdx19,
100 	Pamdx20,
101 	Pamdy1,
102 	Pamdy2,
103 	Pamdy3,
104 	Pamdy4,
105 	Pamdy5,
106 	Pamdy6,
107 	Pamdy7,
108 	Pamdy8,
109 	Pamdy9,
110 	Pamdy10,
111 	Pamdy11,
112 	Pamdy12,
113 	Pamdy13,
114 	Pamdy14,
115 	Pamdy15,
116 	Pamdy16,
117 	Pamdy17,
118 	Pamdy18,
119 	Pamdy19,
120 	Pamdy20,
121 	Ppltscale,
122 	Pxpixelsz,
123 	Pypixelsz,
124 	Ppltra,
125 	Ppltrah,
126 	Ppltram,
127 	Ppltras,
128 	Ppltdec,
129 	Ppltdecd,
130 	Ppltdecm,
131 	Ppltdecs,
132 	Pnparam
133 };
134 
135 #define	UNKNOWNMAG	32767
136 #define	NPlanet			20
137 
138 typedef float	Angle;	/* in radians */
139 typedef int32	DAngle;	/* on disk: in units of milliarcsec */
140 typedef short	Mag;	/* multiplied by 10 */
141 typedef int32	Key;	/* known to be 4 bytes, unfortunately */
142 
143 /*
144  * All integers are stored in little-endian order.
145  */
146 typedef struct NGCrec NGCrec;
147 struct NGCrec{
148 	DAngle	ra;
149 	DAngle	dec;
150 	DAngle	dummy1;	/* compatibility with old RNGC version */
151 	DAngle	diam;
152 	Mag	mag;
153 	short	ngc;	/* if >NNGC, IC number is ngc-NNGC */
154 	char	diamlim;
155 	char	type;
156 	char	magtype;
157 	char	dummy2;
158 	char	desc[52];	/* 0-terminated Dreyer description */
159 };
160 
161 typedef struct Abellrec Abellrec;
162 struct Abellrec{
163 	DAngle	ra;
164 	DAngle	dec;
165 	DAngle	glat;
166 	DAngle	glong;
167 	Mag	mag10;	/* mag of 10th brightest cluster member; in same place as ngc.mag*/
168 	short	abell;
169 	DAngle	rad;
170 	short	pop;
171 	short	dist;
172 	char	distgrp;
173 	char	richgrp;
174 	char	flag;
175 	char	pad;
176 };
177 
178 typedef struct Planetrec Planetrec;
179 struct Planetrec{
180 	DAngle	ra;
181 	DAngle	dec;
182 	DAngle	az;
183 	DAngle	alt;
184 	DAngle	semidiam;
185 	double	phase;
186 	char		name[16];
187 };
188 
189 /*
190  * Star names: 0,0==unused.  Numbers are name[0]=1,..,99.
191  * Greek letters are alpha=101, etc.
192  * Constellations are alphabetical order by abbreviation, and=1, etc.
193  */
194 typedef struct SAOrec SAOrec;
195 struct SAOrec{
196 	DAngle	ra;
197 	DAngle	dec;
198 	DAngle	dra;
199 	DAngle	ddec;
200 	Mag	mag;		/* visual */
201 	Mag	mpg;
202 	char	spec[3];
203 	char	code;
204 	char	compid[2];
205 	char	hdcode;
206 	char	pad1;
207 	int32	hd;		/* HD catalog number */
208 	char	name[3];	/* name[0]=alpha name[1]=2 name[3]=ori */
209 	char	nname;		/* number of prose names */
210 	/* 36 bytes to here */
211 };
212 
213 typedef struct Mindexrec Mindexrec;
214 struct Mindexrec{	/* code knows the bit patterns in here; this is a long */
215 	char	m;		/* M number */
216 	char	dummy;
217 	short	ngc;
218 };
219 
220 typedef struct Bayerec Bayerec;
221 struct Bayerec{
222 	int32	sao;
223 	char	name[3];
224 	char	pad;
225 };
226 
227 /*
228  * Internal form
229  */
230 
231 typedef struct Namedrec Namedrec;
232 struct Namedrec{
233 	char	name[36];
234 };
235 
236 typedef struct Namerec Namerec;
237 struct Namerec{
238 	int32	sao;
239 	int32	ngc;
240 	int32	abell;
241 	char	name[36];	/* null terminated */
242 };
243 
244 typedef struct Patchrec Patchrec;
245 struct Patchrec{
246 	int	nkey;
247 	int32	key[60];
248 };
249 
250 typedef struct Record Record;
251 struct Record{
252 	Type	type;
253 	int32	index;
254 	union{
255 		SAOrec	sao;
256 		NGCrec	ngc;
257 		Abellrec	abell;
258 		Namedrec	named;
259 		Patchrec	patch;
260 		Planetrec	planet;
261 		/* PatchCrec is empty */
262 	} u;
263 };
264 
265 typedef struct Name Name;
266 struct Name{
267 	char	*name;
268 	int	type;
269 };
270 
271 typedef	struct	Plate	Plate;
272 struct	Plate
273 {
274 	char	rgn[7];
275 	char	disk;
276 	Angle	ra;
277 	Angle	dec;
278 };
279 
280 typedef	struct	Header	Header;
281 struct	Header
282 {
283 	float	param[Pnparam];
284 	int	amdflag;
285 
286 	float	x;
287 	float	y;
288 	float	xi;
289 	float	eta;
290 };
291 typedef	int32	Pix;
292 
293 typedef struct	Img Img;
294 struct	Img
295 {
296 	int	nx;
297 	int	ny;	/* ny is the fast-varying dimension */
298 	Pix	a[1];
299 };
300 
301 #define	RAD(x)	((x)*PI_180)
302 #define	DEG(x)	((x)/PI_180)
303 #define	ARCSECONDS_PER_RADIAN	(DEG(1)*3600)
304 #define	MILLIARCSEC	(1000*60*60)
305 
306 int	nplate;
307 Plate	plate[2000];		/* needs to go to 2000 when the north comes */
308 double	PI_180;
309 double	TWOPI;
310 double	LN2;
311 int	debug;
312 struct
313 {
314 	float	min;
315 	float	max;
316 	float	gamma;
317 	float	absgamma;
318 	float	mult1;
319 	float	mult2;
320 	int	neg;
321 } gam;
322 
323 typedef struct Picture Picture;
324 struct Picture
325 {
326 	int	minx;
327 	int	miny;
328 	int	maxx;
329 	int	maxy;
330 	char	name[16];
331 	uchar	*data;
332 };
333 
334 #ifndef _DRAW_H_
335 typedef struct Image Image;
336 #endif
337 
338 extern	double	PI_180;
339 extern	double	TWOPI;
340 extern	char	*progname;
341 extern	char	*desctab[][2];
342 extern	Name	names[];
343 extern	Record	*rec;
344 extern	int32		nrec;
345 extern	Planetrec	*planet;
346 /* for bbox: */
347 extern	int		folded;
348 extern	DAngle	ramin;
349 extern	DAngle	ramax;
350 extern	DAngle	decmin;
351 extern	DAngle	decmax;
352 extern	Biobuf	bout;
353 
354 extern void saoopen(void);
355 extern void ngcopen(void);
356 extern void patchopen(void);
357 extern void mopen(void);
358 extern void constelopen(void);
359 extern void lowercase(char*);
360 extern void lookup(char*, int);
361 extern int typetab(int);
362 extern char*ngcstring(int);
363 extern char*skip(int, char*);
364 extern void prrec(Record*);
365 extern int equal(char*, char*);
366 extern int parsename(char*);
367 extern void radec(int, int*, int*, int*);
368 extern int btag(short);
369 extern int32 patcha(Angle, Angle);
370 extern int32 patch(int, int, int);
371 extern char*hms(Angle);
372 extern char*dms(Angle);
373 extern char*ms(Angle);
374 extern char*hm(Angle);
375 extern char*dm(Angle);
376 extern char*deg(Angle);
377 extern char*hm5(Angle);
378 extern int32 dangle(Angle);
379 extern Angle angle(DAngle);
380 extern void prdesc(char*, char*(*)[2], short*);
381 extern double	xsqrt(double);
382 extern Angle	dist(Angle, Angle, Angle, Angle);
383 extern Header*	getheader(char*);
384 extern char*	getword(char*, char*);
385 extern void	amdinv(Header*, Angle, Angle, float, float);
386 extern void	ppoinv(Header*, Angle, Angle);
387 extern void	xypos(Header*, Angle, Angle, float, float);
388 extern void	traneqstd(Header*, Angle, Angle);
389 extern Angle	getra(char*);
390 extern Angle	getdec(char*);
391 extern void	getplates(void);
392 extern Img*	dssread(char*);
393 extern void	hinv(Pix*, int, int);
394 extern int	input_bit(Biobuf*);
395 extern int	input_nbits(Biobuf*, int);
396 extern int	input_huffman(Biobuf*);
397 extern	int	input_nybble(Biobuf*);
398 extern void	qtree_decode(Biobuf*, Pix*, int, int, int, int);
399 extern void	start_inputing_bits(void);
400 extern Picture*	image(Angle, Angle, Angle, Angle);
401 extern char*	dssmount(int);
402 extern int	dogamma(Pix);
403 extern void	displaypic(Picture*);
404 extern void	displayimage(Image*);
405 extern void	plot(char*);
406 extern void	astro(char*, int);
407 extern char*	alpha(char*, char*);
408 extern char*	skipbl(char*);
409 extern void	flatten(void);
410 extern int		bbox(int32, int32, int);
411 extern int		inbbox(DAngle, DAngle);
412 extern char*	nameof(Record*);
413 
414 #define	NINDEX	400
415