/* 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; }
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 */ }
/* 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; }
/* 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; }
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; }