diff options
Diffstat (limited to 'funtools/filter/symbols.c')
-rw-r--r-- | funtools/filter/symbols.c | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/funtools/filter/symbols.c b/funtools/filter/symbols.c new file mode 100644 index 0000000..e6bb899 --- /dev/null +++ b/funtools/filter/symbols.c @@ -0,0 +1,323 @@ +/* + * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory + */ + +/* + * + * symbols.c -- management of filter symbols + * + */ + +#include <filter.h> + +#define SYMINC 100 /* increment for allocating symbols */ + +static char *bincols=NULL; +static char xbin[SZ_LINE]; +static char ybin[SZ_LINE]; + +extern char *filtinchar; + +/* + * + * Public Routines + * + */ + +/* + * + * FilterSymbolInit -- init the symbol table + * + */ +#ifdef ANSI_FUNC +int +FilterSymbolInit(Filter filter) +#else +int FilterSymbolInit(filter) + Filter filter; +#endif +{ + /* make sure we are init'ed */ + if( filter == NULL ){ + gerror(stderr, "symbol table not initialized\n"); + return(0); + } + filter->symtab = (FilterSymbols)xcalloc(SYMINC, sizeof(FilterSymRec)); + filter->nsyms = 0; + filter->maxsyms = SYMINC; + return(SYMINC); +} + +/* + * + * FilterSymbolEnter -- enter a new symbol in the symbol table + * The symbol will either be a column name, or + * a parameter in the table header, or + * a parameter in the primary header + * + */ +#ifdef ANSI_FUNC +char * +FilterSymbolEnter(Filter filter, char *s, int *got) +#else +char *FilterSymbolEnter(filter, s, got) + Filter filter; + char *s; + int *got; +#endif +{ + int brack=0; + int i, j; + char *t; + FilterSymbols sp; + char name[SZ_LINE]; + FITSCard card; + FITSHead fhd; + + /* see return value */ + if( got ) *got =-3; + + /* make sure we are init'ed */ + if( filter == NULL ){ + gerror(stderr, "symbol table not initialized\n"); + return(NULL); + } + + /* make sure we are init'ed */ + if( filter->fhd == NULL ){ + gerror(stderr, "symbol table not initialized\n"); + return(NULL); + } + fhd = filter->fhd; + + /* make sure we have something */ + if( !s || !*s ) + return(NULL); + + /* this is the name of the variable in the filter program */ + nowhite(s, name); + /* but strip off brackets */ + if( (t=strchr(name, '[')) != NULL ){ + brack=1; + *t = '\0'; + } + + /* loop through the symbol table and look for existing symbol */ + for(i=0; i<filter->nsyms; i++){ + sp = &(filter->symtab[i]); + /* skip accidentally empty ones */ + if( (sp->name == NULL) || (*sp->name == '\0') ) + continue; + /* is this name already entered? */ + if( !strcasecmp(sp->name, name) ){ + if( got ) *got = 1; + return (char *)sp->name; + } + } + + /* make sure there is room for a new symbol */ + if( i >= filter->maxsyms ){ + filter->maxsyms += SYMINC; + filter->symtab = (FilterSymbols)xrealloc(filter->symtab, + filter->maxsyms*sizeof(FilterSymRec)); + } + + /* this is where the next symbol will be entered */ + sp = &(filter->symtab[i]); + + /* look for name in the list of columns */ + if( fhd->table ){ + for(j=0; j<fhd->table->tfields; j++){ + if( !strcasecmp(name, fhd->table->col[j].name) ){ + if( brack && (fhd->table->col[j].n==1) ){ + if( got ) *got = -2; + return(NULL); + } + sp->type = SYM_COL; + sp->name = (char *)xstrdup(name); + sp->idx = j; + filter->size += fhd->table->col[j].size; + filter->nsyms++; + if( got ) *got = 1; + return (char *)sp->name; + } + } + } + /* look for name in the table header */ + if( (t=ft_headgets(fhd, name, 0, NULL, &card)) ){ + sp->type = SYM_PAR; + sp->name = xstrdup(name); + sp->value = t; + sp->idx = -1; + filter->nsyms++; + if( got ) *got = 2; + return (char *)sp->name; + } + /* look for name in the primary header */ + else if( fhd->primary && + (t=ft_headgets(fhd->primary, name, 0, NULL, &card)) ){ + sp->type = SYM_PAR; + sp->name = xstrdup(name); + sp->value = t; + sp->idx = -1; + filter->nsyms++; + if( got ) *got = 2; + return (char *)sp->name; + } + /* did not find the symbol anywhere */ + else{ + gerror(stderr, "can't find '%s' in table\n", s); + if( got ) *got = -1; + return(NULL); + } +} /* EnterSymbol */ + + +/* + * + * FilterSymbolLookup -- lookup a symbol in the symbol table + * + */ +#ifdef ANSI_FUNC +FilterSymbols +FilterSymbolLookup(Filter filter, char *name) +#else +FilterSymbols FilterSymbolLookup(filter, name) + Filter filter; + char *s; +#endif +{ + int i; + + /* sanity check */ + if( !name || !*name ) return NULL; + + /* loop through the symbol table and look for existing symbol */ + for(i=0; i<filter->nsyms; i++){ + /* skip accidentally empty ones */ + if( (filter->symtab[i].name == NULL) || (*filter->symtab[i].name == '\0') ) + continue; + /* look for name */ + if( !strcasecmp(filter->symtab[i].name, name) ){ + /* return symbol table record if found */ + return &filter->symtab[i]; + } + } + return NULL; +} + +/* + * + * FilterSymbolDefaults -- enter default symbols for X and Y columns + * + */ +#ifdef ANSI_FUNC +int +FilterSymbolDefaults(Filter filter, int enter) +#else +int FilterSymbolDefaults(filter, enter) + Filter filter; + int enter; +#endif +{ + int ip=0; + char tbuf[SZ_LINE]; + char *mbuf; + char *k; + char *s; + + /* this is only for events */ + if( !filter || !filter->fhd || !filter->fhd->table ) + return 0; + + /* parse bincols variable */ + if( !bincols ){ + mbuf = xstrdup(filter->mode); + if( !keyword(mbuf, "bincols", tbuf, SZ_LINE) ) + return 0; + if( mbuf ) xfree(mbuf); + s = tbuf; + /* parse the bincols string and add the symbols */ + newdtable(",:)"); + bincols = xstrdup(s); + k = bincols; + /* point past first paren */ + if( *bincols == '(' ) + k++; + if( !word(k, xbin, &ip) || !word(k, ybin, &ip) ){ + freedtable(); + return 0; + } + freedtable(); + /* set the filter bin strings */ + if( filter->xbin ) xfree(filter->xbin); + filter->xbin = xstrdup(xbin); + if( filter->ybin ) xfree(filter->ybin); + filter->ybin = xstrdup(ybin); + } + else if( !filter->xbin || !filter->ybin ){ + /* set the filter bin strings */ + if( filter->xbin ) xfree(filter->xbin); + filter->xbin = xstrdup(xbin); + if( filter->ybin ) xfree(filter->ybin); + filter->ybin = xstrdup(ybin); + } + + /* enter symbols if necessary */ + if( enter ){ + if( !FilterSymbolEnter(filter, xbin, NULL) || + !FilterSymbolEnter(filter, ybin, NULL) ) + return 0; + } + return 1; +} + +/* + * + * FilterSymbolFree -- free space from symbol table + * + */ +#ifdef ANSI_FUNC +void +FilterSymbolFree(Filter filter) +#else +void FilterSymbolFree(filter) + Filter filter; +#endif +{ + int i; + FilterSymbols sp; + + /* if we have no symbols, just return */ + if( !filter || !filter->nsyms ) + return; + + /* loop through the symbol table and free up records */ + for(i=0; i<filter->nsyms; i++){ + sp = &(filter->symtab[i]); + /* skip accidentally empty ones */ + if( (sp->name == NULL) || (*sp->name == '\0') ) + continue; + /* process this type of symbol */ + switch(sp->type){ + case SYM_COL: + xfree(sp->name); + sp->name = NULL; + break; + case SYM_PAR: + xfree(sp->name); + xfree(sp->value); + sp->name = NULL; + break; + } + } + /* no symbols */ + filter->nsyms = 0; + if( bincols != NULL ){ + xfree(bincols); + bincols = NULL; + *xbin = '\0'; + *ybin = '\0'; + } +} + |