⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scat.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(ramin > ramax)		min -= circle;	for(x=min; x<=ramax; x+=250*60*60){		xx = x;		if(xx < 0)			xx += circle;		for(y=decmin; y<=decmax; y+=250*60*60)			if(-circle/4 < y && y < circle/4)				loadpatch(patcha(angle(xx), angle(y)));	}	sort();	cull(nil, 1, 1);	return 1;}voidpplate(char *flags){	int i;	long c;	int na, rah, ram, d1, d2;	double r0;	int ra, dec;	long ramin, ramax, decmin, decmax;	/* all in degrees */	Record *r;	int folded;	Angle racenter, deccenter, rasize, decsize, a[4];	Picture *pic;	rasize = -1.0;	decsize = -1.0;	na = 0;	for(;;){		while(*flags==' ')			flags++;		if(('0'<=*flags && *flags<='9') || *flags=='+' || *flags=='-'){			if(na >= 3)				goto err;			a[na++] = getra(flags);			while(*flags && *flags!=' ')				flags++;			continue;		}		if(*flags){	err:			Bprint(&bout, "syntax error in plate\n");			return;		}		break;	}	switch(na){	case 0:		break;	case 1:		rasize = a[0];		decsize = rasize;		break;	case 2:		rasize = a[0];		decsize = a[1];		break;	case 3:	case 4:		racenter = a[0];		deccenter = a[1];		rasize = a[2];		if(na == 4)			decsize = a[3];		else			decsize = rasize;		if(rasize<0.0 || decsize<0.0){			Bprint(&bout, "negative sizes\n");			return;		}		goto done;	}	folded = 0;	/* convert to milliarcsec */	c = 1000*60*60;    Again:	if(nrec == 0){		Bprint(&bout, "empty\n");		return;	}	ramin = 0x7FFFFFFF;	ramax = -0x7FFFFFFF;	decmin = 0x7FFFFFFF;	decmax = -0x7FFFFFFF;	for(r=rec,i=0; i<nrec; i++,r++){		if(r->type == Patch){			radec(r->index, &rah, &ram, &dec);			ra = 15*rah+ram/4;			r0 = c/cos(RAD(dec));			ra *= c;			dec *= c;			if(dec == 0)				d1 = c, d2 = c;			else if(dec < 0)				d1 = c, d2 = 0;			else				d1 = 0, d2 = c;		}else if(r->type==SAO || r->type==NGC || r->type==Abell){			ra = r->ngc.ra;			dec = r->ngc.dec;			d1 = 0, d2 = 0, r0 = 0;		}else if(r->type==NGCN){			loadngc(r->index);			continue;		}else if(r->type==NamedSAO){			loadsao(r->index);			continue;		}else if(r->type==NamedNGC){			loadngc(r->index);			continue;		}else if(r->type==NamedAbell){			loadabell(r->index);			continue;		}else			continue;		if(dec+d2 > decmax)			decmax = dec+d2;		if(dec-d1 < decmin)			decmin = dec-d1;		if(folded){			ra -= 180*c;			if(ra < 0)				ra += 360*c;		}		if(ra+r0 > ramax)			ramax = ra+r0;		if(ra < ramin)			ramin = ra;	}	if(!folded && ramax-ramin>270*c){		folded = 1;		goto Again;	}	racenter = angle(ramin+(ramax-ramin)/2);	deccenter = angle(decmin+(decmax-decmin)/2);	if(rasize<0 || decsize<0){		rasize = angle(ramax-ramin)*cos(deccenter);		decsize = angle(decmax-decmin);	}    done:	if(DEG(rasize)>1.1 || DEG(decsize)>1.1){		Bprint(&bout, "plate too big: %s", ms(rasize));		Bprint(&bout, " x %s\n", ms(decsize));		Bprint(&bout, "trimming to 30'x30'\n");		rasize = RAD(0.5);		decsize = RAD(0.5);	}	Bprint(&bout, "%s %s ", hms(racenter), dms(deccenter));	Bprint(&bout, "%s", ms(rasize));	Bprint(&bout, " x %s\n", ms(decsize));	Bflush(&bout);	flatten();	pic = image(racenter, deccenter, rasize, decsize);	if(pic == 0)		return;	Bprint(&bout, "plate %s locn %d %d %d %d\n", pic->name, pic->minx, pic->miny, pic->maxx, pic->maxy);	Bflush(&bout);	displaypic(pic);}voidlookup(char *s, int doreset){	int i, j, k;	int rah, ram, deg;	char *starts, *inputline=s, *t, *u;	Record *r;	long n;	double x;	Angle ra;	lowercase(s);	s = skipbl(s);	if(*s == 0)		goto Print;	if(t = alpha(s, "flat")){		if(*t){			fprint(2, "flat takes no arguments\n");			return;		}		if(nrec == 0){			fprint(2, "no records\n");			return;		}		flatten();		goto Print;	}	if(t = alpha(s, "print")){		if(*t){			fprint(2, "print takes no arguments\n");			return;		}		for(i=0,r=rec; i<nrec; i++,r++)			prrec(r);		return;	}	if(t = alpha(s, "add")){		lookup(t, 0);		return;	}	if(t = alpha(s, "sao")){		n = strtoul(t, &u, 10);		if(n<=0 || n>NSAO)			goto NotFound;		t = skipbl(u);		if(*t){			fprint(2, "syntax error in sao\n");			return;		}		if(doreset)			reset();		if(!loadsao(n))			goto NotFound;		goto Print;	}	if(t = alpha(s, "ngc")){		n = strtoul(t, &u, 10);		if(n<=0 || n>NNGC)			goto NotFound;		t = skipbl(u);		if(*t){			fprint(2, "syntax error in ngc\n");			return;		}		if(doreset)			reset();		if(!loadngc(n))			goto NotFound;		goto Print;	}	if(t = alpha(s, "ic")){		n = strtoul(t, &u, 10);		if(n<=0 || n>NIC)			goto NotFound;		t = skipbl(u);		if(*t){			fprint(2, "syntax error in ic\n");			return;		}		if(doreset)			reset();		if(!loadngc(n+NNGC))			goto NotFound;		goto Print;	}	if(t = alpha(s, "abell")){		n = strtoul(t, &u, 10);		if(n<=0 || n>NAbell)			goto NotFound;		if(doreset)			reset();		if(!loadabell(n))			goto NotFound;		goto Print;	}	if(t = alpha(s, "m")){		n = strtoul(t, &u, 10);		if(n<=0 || n>NM)			goto NotFound;		mopen();		for(j=n-1; mindex[j].m<n; j++)			;		if(doreset)			reset();		while(mindex[j].m == n){			if(mindex[j].ngc){				grow();				cur->type = NGCN;				cur->index = mindex[j].ngc;			}			j++;		}		goto Print;	}	for(i=1; i<=Ncon; i++)		if(t = alpha(s, constel[i])){			if(*t){				fprint(2, "syntax error in constellation\n");				return;			}			constelopen();			seek(condb, 4L*conindex[i-1], 0);			j = conindex[i]-conindex[i-1];			Eread(condb, "con", con, 4*j);			if(doreset)				reset();			for(k=0; k<j; k++){				grow();				cur->type = PatchC;				cur->index = Long(&con[k]);			}			goto Print;		}	if(t = alpha(s, "expand")){		n = 0;		if(*t){			if(*t<'0' && '9'<*t){		Expanderr:				fprint(2, "syntax error in expand\n");				return;			}			n = strtoul(t, &u, 10);			t = skipbl(u);			if(*t)				goto Expanderr;		}		coords(n);		goto Print;	}	if(t = alpha(s, "plot")){		if(nrec == 0){			Bprint(&bout, "empty\n");			return;		}		plot(t);		return;	}	if(t = alpha(s, "astro")){		astro(t, 0);		return;	}	if(t = alpha(s, "plate")){		pplate(t);		return;	}	if(t = alpha(s, "gamma")){		while(*t==' ')			t++;		u = t;		x = strtod(t, &u);		if(u > t)			gam.gamma = x;		Bprint(&bout, "%.2f\n", gam.gamma);		return;	}	if(t = alpha(s, "keep")){		if(!cull(t, 1, 0))			return;		goto Print;	}	if(t = alpha(s, "drop")){		if(!cull(t, 0, 0))			return;		goto Print;	}	for(i=0; planet[i].name[0]; i++){		if(t = alpha(s, planet[i].name)){			if(doreset)				reset();			loadplanet(i, nil);			goto Print;		}	}	for(i=0; names[i].name; i++){		if(t = alpha(s, names[i].name)){			if(*t){				fprint(2, "syntax error in type\n");				return;			}			if(doreset)				reset();			loadtype(names[i].type);			goto Print;		}	}	switch(s[0]){	case '"':		starts = ++s;		while(*s != '"')			if(*s++ == 0){				fprint(2, "bad star name\n");				return;			}		*s = 0;		if(doreset)			reset();		j = nrec;		saoopen();		starts = fromgreek(starts);		for(i=0; i<NName; i++)			if(equal(starts, name[i].name)){				grow();				if(name[i].sao){					rec[j].type = NamedSAO;					rec[j].index = name[i].sao;				}				if(name[i].ngc){					rec[j].type = NamedNGC;					rec[j].index = name[i].ngc;				}				if(name[i].abell){					rec[j].type = NamedAbell;					rec[j].index = name[i].abell;				}				strcpy(rec[j].named.name, name[i].name);				j++;			}		if(parsename(starts))			for(i=0; i<NBayer; i++)				if(bayer[i].name[0]==parsed[0] &&				  (bayer[i].name[1]==parsed[1] || parsed[1]==0) &&				   bayer[i].name[2]==parsed[2]){					grow();					rec[j].type = NamedSAO;					rec[j].index = bayer[i].sao;					strncpy(rec[j].named.name, starts, sizeof(rec[j].named.name));					j++;				}		if(j == 0){			*s = '"';			goto NotFound;		}		break;	case '0': case '1': case '2': case '3': case '4':	case '5': case '6': case '7': case '8': case '9':		strtoul(s, &t, 10);		if(*t != 'h'){	BadCoords:			fprint(2, "bad coordinates %s\n", inputline);			break;		}		ra = DEG(getra(s));		while(*s && *s!=' ' && *s!='\t')			s++;		rah = ra/15;		ra = ra-rah*15;		ram = ra*4;		deg = strtol(s, &t, 10);		if(t == s)			goto BadCoords;		/* degree sign etc. is optional */		if((uchar)*t == L'°')			deg = DEG(getra(s));		if(doreset)			reset();		if(abs(deg)>=90 || rah>=24)			goto BadCoords;		if(!loadpatch(patch(rah, ram, deg)))			goto NotFound;		break;	default:		fprint(2, "unknown command %s\n", inputline);		return;	}    Print:	if(nrec == 0)		Bprint(&bout, "empty\n");	else if(nrec <= 2)		for(i=0; i<nrec; i++)			prrec(rec+i);	else		Bprint(&bout, "%ld items\n", nrec);	return;    NotFound:	fprint(2, "%s not found\n", inputline);	return;}char *ngctypes[] ={[Galaxy] 		"Gx",[PlanetaryN]	"Pl",[OpenCl]		"OC",[GlobularCl]	"Gb",[DiffuseN]		"Nb",[NebularCl]	"C+N",[Asterism]		"Ast",[Knot]		"Kt",[Triple]		"***",[Double]		"D*",[Single]		"*",[Uncertain]	"?",[Nonexistent]	"-",[Unknown]	" ",[PlateDefect]	"PD",};char*ngcstring(int d){	if(d<Galaxy || d>PlateDefect)		return "can't happen";	return ngctypes[d];}short	descindex[NINDEX];voidprintnames(Record *r){	int i, ok, done;	done = 0;	for(i=0; i<NName; i++){	/* stupid linear search! */		ok = 0;		if(r->type==SAO && r->index==name[i].sao)			ok = 1;		if(r->type==NGC && r->ngc.ngc==name[i].ngc)			ok = 1;		if(r->type==Abell && r->abell.abell==name[i].abell)			ok = 1;		if(ok){			if(done++ == 0)				Bprint(&bout, "\t");			Bprint(&bout, " \"%s\"", togreek(name[i].name));		}	}	if(done)		Bprint(&bout, "\n");}intequal(char *s1, char *s2){	int c;	while(*s1){		if(*s1==' '){			while(*s1==' ')				s1++;			continue;		}		while(*s2==' ')			s2++;		c=*s2;		if('A'<=*s2 && *s2<='Z')			c^=' ';		if(*s1!=c)			return 0;		s1++, s2++;	}	return 1;}intparsename(char *s){	char *blank;	int i;	blank = strchr(s, ' ');	if(blank==0 || strchr(blank+1, ' ') || strlen(blank+1)!=3)		return 0;	blank++;	parsed[0] = parsed[1] = parsed[2] = 0;	if('0'<=s[0] && s[0]<='9'){		i = atoi(s);		parsed[0] = i;		if(i > 100)			return 0;	}else{		for(i=1; i<=24; i++)			if(strncmp(greek[i], s, strlen(greek[i]))==0){				parsed[0]=100+i;				goto out;			}		return 0;	    out:		if('0'<=s[strlen(greek[i])] && s[strlen(greek[i])]<='9')			parsed[1]=s[strlen(greek[i])]-'0';	}	for(i=1; i<=88; i++)		if(strcmp(constel[i], blank)==0){			parsed[2] = i;			return 1;		}	return 0;}char*dist_grp(int dg){	switch(dg){	default:		return "unknown";	case 1:		return "13.3-14.0";	case 2:		return "14.1-14.8";	case 3:		return "14.9-15.6";	case 4:		return "15.7-16.4";	case 5:		return "16.5-17.2";	case 6:		return "17.3-18.0";	case 7:		return ">18.0";	}}char*rich_grp(int dg){	switch(dg){	default:		return "unknown";	case 0:		return "30-40";	case 1:		return "50-79";	case 2:		return "80-129";	case 3:		return "130-199";	case 4:		return "200-299";	case 5:		return ">=300";	}}char*nameof(Record *r){	NGCrec *n;	SAOrec *s;	Abellrec *a;	static char buf[128];	int i;	switch(r->type){	default:		return nil;	case SAO:		s = &r->sao;		if(s->name[0] == 0)			return nil;		if(s->name[0] >= 100){			i = snprint(buf, sizeof buf, "%C", greeklet[s->name[0]-100]);			if(s->name[1])				i += snprint(buf+i, sizeof buf-i, "%d", s->name[1]);		}else			i = snprint(buf, sizeof buf, " %d", s->name[0]);		snprint(buf+i, sizeof buf-i, " %s", constel[s->name[2]]);		break;	case NGC:		n = &r->ngc;		if(n->type >= Uncertain)			return nil;		if(n->ngc <= NNGC)			snprint(buf, sizeof buf, "NGC%4d ", n->ngc);		else			snprint(buf, sizeof buf, "IC%4d ", n->ngc-NNGC);		break;	case Abell:		a = &r->abell;		snprint(buf, sizeof buf, "Abell%4d", a->abell);		break;	}	return buf;}voidprrec(Record *r){	NGCrec *n;	SAOrec *s;	Abellrec *a;	Planetrec *p;	int i, rah, ram, dec, nn;	long key;	if(r) switch(r->type){	default:		fprint(2, "can't prrec type %d\n", r->type);		exits("type");	case Planet:		p = &r->planet;		Bprint(&bout, "%s", p->name);		Bprint(&bout, "\t%s %s",			hms(angle(p->ra)),			dms(angle(p->dec)));		Bprint(&bout, " %3.2f° %3.2f°",			p->az/(double)MILLIARCSEC, p->alt/(double)MILLIARCSEC);		Bprint(&bout, " %s",			ms(angle(p->semidiam)));		if(r->index <= 1)			Bprint(&bout, " %g", p->phase);		Bprint(&bout, "\n");		break;	case NGC:		n = &r->ngc;		if(n->ngc <= NNGC)			Bprint(&bout, "NGC%4d ", n->ngc);		else			Bprint(&bout, "IC%4d ", n->ngc-NNGC);		Bprint(&bout, "%s ", ngcstring(n->type));		if(n->mag == UNKNOWNMAG)			Bprint(&bout, "----");		else			Bprint(&bout, "%.1f%c", n->mag/10.0, n->magtype);		Bprint(&bout, "\t%s %s\t%c%.1f'\n",			hm(angle(n->ra)),			dm(angle(n->dec)),			n->diamlim,			DEG(angle(n->diam))*60.);		prdesc(n->desc, desctab, descindex);		printnames(r);		break;	case Abell:		a = &r->abell;		Bprint(&bout, "Abell%4d  %.1f %.2f° %dMpc", a->abell, a->mag10/10.0,			DEG(angle(a->rad)), a->dist);		Bprint(&bout, "\t%s %s\t%.2f %.2f\n",			hm(angle(a->ra)),			dm(angle(a->dec)),			DEG(angle(a->glat)),			DEG(angle(a->glong)));		Bprint(&bout, "\tdist grp: %s  rich grp: %s  %d galaxies/°²\n",			dist_grp(a->distgrp),			rich_grp(a->richgrp),			a->pop);		printnames(r);		break;	case SAO:		s = &r->sao;		Bprint(&bout, "SAO%6ld  ", r->index);		if(s->mag==UNKNOWNMAG)			Bprint(&bout, "---");		else			Bprint(&bout, "%.1f", s->mag/10.0);		if(s->mpg==UNKNOWNMAG)			Bprint(&bout, ",---");		else			Bprint(&bout, ",%.1f", s->mpg/10.0);		Bprint(&bout, "  %s %s  %.4fs %.3f\"",			hms(angle(s->ra)),			dms(angle(s->dec)),			DEG(angle(s->dra))*(4*60),			DEG(angle(s->ddec))*(60*60));		Bprint(&bout, "  %.3s %c %.2s %ld %d",			s->spec, s->code, s->compid, s->hd, s->hdcode);		if(s->name[0])			Bprint(&bout, " \"%s\"", nameof(r));		Bprint(&bout, "\n");		printnames(r);		break;	case Patch:		radec(r->index, &rah, &ram, &dec);		Bprint(&bout, "%dh%dm %d°", rah, ram, dec);		key = r->patch.key[0];		Bprint(&bout, " %s", constel[key&0xFF]);		if((key>>=8) & 0xFF)			Bprint(&bout, " %s", constel[key&0xFF]);		if((key>>=8) & 0xFF)			Bprint(&bout, " %s", constel[key&0xFF]);		if((key>>=8) & 0xFF)			Bprint(&bout, " %s", constel[key&0xFF]);		for(i=1; i<r->patch.nkey; i++){			key = r->patch.key[i];			switch(key&0x3F){			case SAO:				Bprint(&bout, " SAO%ld", (key>>8)&0xFFFFFF);				break;			case Abell:				Bprint(&bout, " Abell%ld", (key>>8)&0xFFFFFF);				break;			default:	/* NGC */				nn = (key>>16)&0xFFFF;				if(nn > NNGC)					Bprint(&bout, " IC%d", nn-NNGC);				else					Bprint(&bout, " NGC%d", nn);				Bprint(&bout, "(%s)", ngcstring(key&0x3F));				break;			}		}		Bprint(&bout, "\n");		break;	case NGCN:		if(r->index <= NNGC)			Bprint(&bout, "NGC%ld\n", r->index);		else			Bprint(&bout, "IC%ld\n", r->index-NNGC);		break;	case NamedSAO:		Bprint(&bout, "SAO%ld \"%s\"\n", r->index, togreek(r->named.name));		break;	case NamedNGC:		if(r->index <= NNGC)			Bprint(&bout, "NGC%ld \"%s\"\n", r->index, togreek(r->named.name));		else			Bprint(&bout, "IC%ld \"%s\"\n", r->index-NNGC, togreek(r->named.name));		break;	case NamedAbell:		Bprint(&bout, "Abell%ld \"%s\"\n", r->index, togreek(r->named.name));		break;	case PatchC:		radec(r->index, &rah, &ram, &dec);		Bprint(&bout, "%dh%dm %d\n", rah, ram, dec);		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -