Example #1
0
/* read the noise pars from the list (open brace has already been read)
 * stop when the closing brace is found, or on eof */
static int get_noise_from_rcp(GScanner *scan, struct cat_star *cats)
{
	GTokenType tok;
	int i;

	for (i = 0; i < NOISE_LAST; i++)
		cats->noise[i] = 0.0;
	cats->flags |= INFO_NOISE;
	do {
		tok = g_scanner_get_next_token(scan);
//		d3_printf("flags ");
//		print_token(scan, tok);
		if (tok != G_TOKEN_SYMBOL)
			continue;
		switch(intval(scan)) {
		case SYM_SKY:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->noise[NOISE_SKY] = floatval(scan);
			break;
		case SYM_PHOTON:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->noise[NOISE_PHOTON] = floatval(scan);
			break;
		case SYM_READ:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->noise[NOISE_READ] = floatval(scan);
			break;
		case SYM_SCINT:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->noise[NOISE_SCINT] = floatval(scan);
			break;
		default:
			break;
		}
	} while (tok != ')' && tok != G_TOKEN_EOF);
	return 0;
}
Example #2
0
File: bpx.c Project: edechter/PRISM
double bpx_get_float(TERM t) {
	XDEREF(t);

	if (ISINT(t)) {
		return (double)(INTVAL(t));
	} else if (ISFLOAT(t)) {
		return floatval(t);
	} else {
		bpx_raise("integer or floating number expected");
	}

	return 0.0;  /* should not be reached */
}
Example #3
0
/* read the position from the list (open brace has already been read)
 * stop when the closing brace is found, or on eof */
static int get_centroid_from_rcp(GScanner *scan, struct cat_star *cats)
{
	GTokenType tok;
	int i;

	for (i = 0; i < NOISE_LAST; i++)
		cats->noise[i] = 0.0;
	cats->flags |= INFO_POS;
	do {
		tok = g_scanner_get_next_token(scan);
//		d3_printf("flags ");
//		print_token(scan, tok);
		if (tok != G_TOKEN_SYMBOL)
			continue;
		switch(intval(scan)) {
		case SYM_X:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_X] = floatval(scan);
			break;
		case SYM_Y:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_Y] = floatval(scan);
			break;
		case SYM_DX:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_DX] = floatval(scan);
			break;
		case SYM_DY:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_DY] = floatval(scan);
			break;
		case SYM_XERR:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_XERR] = floatval(scan);
			break;
		case SYM_YERR:
			tok = g_scanner_get_next_token(scan);
			if (tok == G_TOKEN_FLOAT)
				cats->pos[POS_YERR] = floatval(scan);
			break;
		default:
			break;
		}
	} while (tok != ')' && tok != G_TOKEN_EOF);
	return 0;
}
Example #4
0
/* read a star file frame (one s-expression) from the given file pointer,
   and return the stf of the root node */
struct stf *stf_read_frame(FILE *fp)
{
	GScanner *scan;
	GTokenType tok;
	int level = 0;
	int minus = 0;
	GList *sl;
	struct stf *ret = NULL;
	struct stf *lstf[STF_MAX_DEPTH];
	struct stf *stf=NULL, *nstf = NULL;

	lstf[0] = NULL;
	scan = init_scanner();
	g_scanner_input_file(scan, fileno(fp));
	do {
		tok = g_scanner_get_next_token(scan);
//		d3_printf("level %d ", level);
//		print_token(scan, tok);
		if (level == 0 && tok != '(')
			continue;
		if (level == 1 && tok == ')') {
			ret = lstf[0];
			break;
		}
		if (minus)
			minus --;
		switch(tok) {
		case '(':
			if (level >= STF_MAX_DEPTH - 1)
				break;
			nstf = stf_new();
			lstf[level] = nstf;
			if (level > 0) {
				stf->next = nstf;
				STF_SET_LIST(nstf, stf_new());
				stf = STF_LIST(nstf);
			} else {
				stf = nstf;
			}
			level ++;
			break;
		case ')':
			stf = lstf[level-1];
			level --;
			break;
		case G_TOKEN_SYMBOL:
			if (!STF_IS_NIL(stf)) {
				nstf = stf_new();
				stf->next = nstf;
				stf = nstf;
			}
			STF_SET_SYMBOL(stf, intval(scan));
			if (intval(scan) == SYM_STARS) {
				sl = read_star_list(scan);
				if (sl == NULL)
					break;
				nstf = stf_new();
				stf->next = nstf;
				stf = nstf;
				STF_SET_GLIST(stf, sl);
			}
			break;
		case '-':
			minus = 2;
			break;
		case G_TOKEN_FLOAT:
			if (!STF_IS_NIL(stf)) {
				nstf = stf_new();
				stf->next = nstf;
				stf = nstf;
			}
			STF_SET_DOUBLE(stf, minus?-floatval(scan):floatval(scan));
			break;
		case G_TOKEN_STRING:
			if (!STF_IS_NIL(stf)) {
				nstf = stf_new();
				stf->next = nstf;
				stf = nstf;
			}
			STF_SET_STRING(stf, strdup(stringval(scan)));
			break;
		case G_TOKEN_IDENTIFIER:
			err_printf("unexpected identifier: %s\n", stringval(scan));
//			if (!STF_IS_NIL(stf)) {
//				nstf = stf_new();
//				stf->next = nstf;
//				stf = nstf;
//			}
//			STF_SET_IDENT(stf, strdup(stringval(scan)));
//			break;
		default:
			err_printf("unexected token %d\n", tok);
			break;
		}
	} while (tok != G_TOKEN_EOF);
	g_scanner_sync_file_offset(scan);
	g_scanner_destroy(scan);
	return ret;
}
Example #5
0
int parse_star(GScanner *scan, struct cat_star *cats)
{
	int havera = 0, havedec = 0, havename = 0, havemag = 0, haveeq = 0;
	GTokenType tok;

	do {
		tok = g_scanner_get_next_token(scan);
//		d3_printf("star ");
//		print_token(scan, tok);
		if (tok == ')')
			continue;
		if (tok != G_TOKEN_SYMBOL) {
//			d3_printf("skip non-symbol\n");
			if (tok == '(')
				skip_list(scan);
			else
				skip_one(scan);
			continue;
		}
		switch(intval(scan)) {
		case SYM_RA:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				havera = !dms_to_degrees(stringval(scan),
							  &cats->ra);
				cats->ra *= 15.0;
				break;
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->ra = -floatval(scan);
				havera = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->ra = floatval(scan);
				havera = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_DEC:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				havedec = !dms_to_degrees(stringval(scan),
							  &cats->dec);
				break;
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->dec = -floatval(scan);
				havedec = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->dec = floatval(scan);
				havedec = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_EQUINOX:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				haveeq = 1;
				cats->equinox = -floatval(scan);
				break;
			case G_TOKEN_FLOAT:
				haveeq = 1;
				cats->equinox = floatval(scan);
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_PERR:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->perr = -floatval(scan);
				break;
			case G_TOKEN_FLOAT:
				cats->perr = floatval(scan);
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_MAG:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->mag = -floatval(scan);
				havemag = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->mag = floatval(scan);
				havemag = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_SKY:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->sky = -floatval(scan);
				cats->flags |= INFO_SKY;
				break;
			case G_TOKEN_FLOAT:
				cats->sky = floatval(scan);
				cats->flags |= INFO_SKY;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_DIFFAM:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->diffam = -floatval(scan);
				cats->flags |= INFO_DIFFAM;
				break;
			case G_TOKEN_FLOAT:
				cats->diffam = floatval(scan);
				cats->flags |= INFO_DIFFAM;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_RESIDUAL:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->residual = -floatval(scan);
				cats->flags |= INFO_RESIDUAL;
				break;
			case G_TOKEN_FLOAT:
				cats->residual = floatval(scan);
				cats->flags |= INFO_RESIDUAL;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_STDERR:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->std_err = -floatval(scan);
				cats->flags |= INFO_STDERR;
				break;
			case G_TOKEN_FLOAT:
				cats->std_err = floatval(scan);
				cats->flags |= INFO_STDERR;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_COMMENTS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->comments = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_SMAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->smags = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_IMAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->imags = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_NAME:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				strncpy(cats->name, stringval(scan), CAT_STAR_NAME_SZ);
				havename = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_TYPE:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_SYMBOL:
				switch(intval(scan)) {
				case SYM_STD:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_APSTD;
					cats->flags &= ~CAT_VARIABLE;
					break;
				case SYM_TGT:
				case SYM_TARGET:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_APSTAR;
					break;
				case SYM_FIELD:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_SREF;
					break;
				case SYM_CATALOG:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_CAT;
					break;
				default:
					break;
				}
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_FLAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				cats->flags |= get_flags_from_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_NOISE:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				get_noise_from_rcp(scan, cats);
				break;
			default:
				break;
			}
			break;
		case SYM_CENTROID:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				get_centroid_from_rcp(scan, cats);
				break;
			default:
				break;
			}
			break;
		default:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		}
	} while (tok != ')' && tok != G_TOKEN_EOF);
	if (!havemag || cats->mag == 0.0) {
//		mag_from_smags(cats);
	}
	if (!haveeq)
		cats->equinox = 2000.0;
	if (havedec && havera && havename)
		return 0;
	else
		return -1;
}