diff options
Diffstat (limited to 'funtools/filter/filter.h')
-rw-r--r-- | funtools/filter/filter.h | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/funtools/filter/filter.h b/funtools/filter/filter.h new file mode 100644 index 0000000..7a49bdc --- /dev/null +++ b/funtools/filter/filter.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory + */ + +/* + * + * filter.h - include file for "compile on the fly" filters + * + */ + +#ifndef __filter_h +#define __filter_h + +#if HAVE_CONFIG_H +#include "conf.h" +#endif + +/* avoid use of system -- its not secure */ +/* but funtools cannot use launch for the MinGW platform because the stdfiles + support is missing in the launch_spawnvp() implementation of launch */ +#ifndef USE_LAUNCH +#define USE_LAUNCH 1 +#endif +#if HAVE_MINGW32 +#undef USE_LAUNCH +#endif + +#include <stdio.h> +#include <ctype.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#include <sys/types.h> +#include "prsetup.h" +#include "gio.h" +#include "file.h" +#include "find.h" +#include "macro.h" +#include "word.h" +#include "xalloc.h" +#include "strtod.h" +#define USE_XFILEIO 1 +#include "fitsy.h" +#undef USE_XFILEIO +#include "idx.h" +#include "wcs.h" +#include "column.h" +#include "tl.h" +#include "dl.h" +#include "mkrtemp.h" +#include "zprocess.h" +#include "winprocess.h" +#include "parse.h" +#ifdef USE_LAUNCH +#include "xlaunch.h" +#endif + +#ifndef OBJPATH +#define OBJPATH "." +#endif + +#ifndef FILTER_CC +#define FILTER_CC NULL +#endif + +#ifndef FILTER_CFLAGS +#define FILTER_CFLAGS NULL +#endif + +/* define methods of program generation */ +#define METHOD_C 1 + +/* define types of filtering */ +#define TYPE_EVENTS 1 +#define TYPE_IMAGE 2 + +/* define types of filtering process -- separate process, self-contained + separate process, or dynamic load (if defined) */ +#define PTYPE_PROCESS 1 +#define PTYPE_CONTAINED 2 +#define PTYPE_DYNAMIC 3 + +/* define how we connect the processes -- unix or windows pipes */ +#define PIPE_UNIX 0 +#define PIPE_WIN32 1 + + +/* defaults which can be overridden by environment variables */ +#define DEFAULT_FILTER_METHOD METHOD_C +#define DEFAULT_FILTER_TYPE TYPE_EVENTS +#ifdef USE_DL +#define DEFAULT_FILTER_PTYPE PTYPE_DYNAMIC +#else +#define DEFAULT_FILTER_PTYPE PTYPE_PROCESS +#endif +#define DEFAULT_PAINT_MODE "false" +#define DEFAULT_FILTER_TMPDIR "/tmp" + +/* define type of important tokens */ +#define TOK_EREG 1 +#define TOK_NREG 2 +#define TOK_IREG 4 +#define TOK_RLIST 8 +#define TOK_RTINE 16 +#define TOK_NAME 32 +#define TOK_ACCEL 64 +#define TOK_VARARGS 128 + +#define TOK_REG (TOK_EREG|TOK_NREG|TOK_IREG) + +/* default cordinate system for regions */ +#define DEFAULT_COORDSYS "physical" + +/* if we have gcc, we can use dynamic loading instead of a separate process */ +#define GCC_SHARED_FLAGS "-g -fPIC -shared" + +/* places to look for the compiler other than user's path */ +#define CC_PATH "/opt/SUNWspro/bin:/bin:/usr/bin:/usr/local/bin/:/opt/local/bin:" + +/* define non-WCS coordinate systems we handle specially */ +#define LCX_IMAGE 1 +#define LCX_PHYS 2 +#define LCX_AMP 3 +#define LCX_DET 4 + +/* define symbol types in symbol table */ +#define SYM_COL 1 +#define SYM_PAR 2 + +/* whether we use only the index and not the compiled filter */ +#define FILTER_INDEX_ONLY(f) \ + ((f->doidx==1)&&(f->idx)&&(f->idx->dofilt==0)&&(f->idx->rtype!=IDX_INDEF)) + +typedef struct filtmask { + int region; + int y; + int xstart, xstop; +} *FilterMask, FilterMaskRec; + +typedef struct scanrec{ + struct scanrec *next; + int x; +} *Scan, ScanRec; + +/* structs for use with region routines */ +typedef struct shaperec { + int init; + double ystart, ystop; + Scan *scanlist; + /* varargs */ + int nv; + double *xv; + /* circle, annulus */ + double r1sq, r2sq; + /* ellipse */ + double angl, sinangl, cosangl; + double cossq, sinsq; + double xradsq, yradsq; + double a; + /* polygon-style shapes */ + int npt; + double *pts; + /* line */ + int xonly; + double x1, x2, y1; + double invslope; +} *Shape, ShapeRec; + +typedef struct gfiltrec { + int nshapes; /* number of shapes */ + int maxshapes; /* number of shape records we allocate */ + Shape shapes; /* array holding range limits for one shape */ + int rid; /* first valid region for current pixel */ + int usebinsiz; /* whether bindizx,binsizy are used */ + char *evsect; /* value of event section */ + double tlminx, tlminy; /* tlmin for event section */ + double binsizx, binsizy; /* bin sizes for event section */ + double tloff; /* offset for quick p2i conversion */ + int xmin, xmax, ymin, ymax; /* section limits in original image coords */ + int block; /* block factor */ + int x0, x1, y0, y1; /* section limits in section coords */ + int *ybuf; /* valid y row flags */ + int *x0s; /* valid x start values */ + int *x1s; /* valid x stop values */ + int nmask; /* number of image mask record */ + int maskdim; /* size of mask image */ + FilterMask masks; /* mask records */ +} *GFilt, GFiltRec; + +typedef struct filtseg { + int n; + int type; + int ops; + int len; + int flag; + int nregion; + char *s; + int s0; + char *regions; + int nr; + char *shapes; + int ns; + int regval; + char *radang; + int ralen; +} *FiltSeg, FiltSegRec; + +/* structs for use with symbol table routines */ +typedef struct filtsymtab { + int type; + char *name; + char *value; + int idx; + int offset; + FITSCard card; +} *FilterSymbols, FilterSymRec; + +typedef struct filtrec { + /* general information */ + char *mode; + char *evsect; + int method; + int type; + int paint; + int debug; + /* the input filter string */ + char *string; + int size; + /* fits info */ + FITSHead fhd; + int convert; + char *xbin; + char *ybin; + /* compiled program info */ + char *code; + char *prog; + FILE *fp; + /* symbol table info */ + int maxsyms; + int nsyms; + int evsize; + FilterSymbols symtab; + /* method info */ + char *cc; + char *cflags; + char *objs; + char *extra; + char *shflags; + /* process info */ + char *pname; + int ptype; + /* which type of pipe? */ + int pipeos; + /* used by unix pipe */ + int pid; + int ichan; + int ochan; + /* used by Windows pipe */ + void *process; + void *ihandle; + void *ohandle; + /* used for dynamic linking */ + void *dl; + GFilt g; + /* loadable drivers for each technique */ + /* NB: can't use typdef because we refer to this struct */ + int (*filt_start) _PRx((struct filtrec *filter)); + int (*filt_open) _PRx((struct filtrec *filter)); + int (*filt_prepend) _PRx((struct filtrec *filter)); + int (*filt_write) _PRx((struct filtrec *filter)); + int (*filt_append) _PRx((struct filtrec *filter)); + int (*filt_close) _PRx((struct filtrec *filter)); + int (*filt_compile) _PRx((struct filtrec *filter)); + int (*filt_end) _PRx((struct filtrec *filter)); + char *(*filt_name) _PRx((struct filtrec *filter, char *name)); + char *(*filt_routine1) _PRx((struct filtrec *filter, char *name)); + char *(*filt_routine2) _PRx((struct filtrec *filter, char *name)); + char *(*filt_region1) _PRx((struct filtrec *filter, char *name)); + char *(*filt_region2) _PRx((struct filtrec *filter, char *name)); + /* fits image mask info */ + int nmask; + int nmaskreg; + FilterMask masks; + FITSHead maskhd; + /* indexing information */ + int doidx; + idxvalrec *valhead; + idxrowrec *rowhead; + idxrowrec *idx; +} *Filter, FilterRec; + +typedef void *(*FilterTableCall)( +#ifdef ANSI_FUNC + void *tg, char *ebuf, int ne, int esize, int *rbuf +#endif +); + +typedef FilterMask (*FilterImageCall)( +#ifdef ANSI_FUNC + int txmin, int txmax, int tymin, int tymax, int tblock, int *got +#endif +); + +/* this makes it look like a simple flag */ +#define NOFILTER FilterNull() + +_PRbeg + +/* filter.c */ +int FilterNum _PRx((void)); +char *FilterClip _PRx((char *filter)); +Filter FilterDefault _PRx((void)); +Filter FilterNull _PRx((void)); +char *FilterPath _PRx((void)); +Filter FilterOpen _PRx((FITSHead header, char *filter, char *mode)); +int FilterEvents _PRx((Filter filter, + char *ebuf, int esize, int n, int *vbuf)); +int FilterImage _PRx((Filter filter, + int x0, int x1, int y0, int y1, int block, + FilterMask *masks, int *nreg)); +int FilterClose _PRx((Filter filter)); +char *FilterConcats _PRx((char **filters, int n)); +char *FilterConcat _PRx((char *f1, char *f2, char *op)); +char *FilterString _PRx((Filter filter)); + +/* symbols.c */ +int FilterSymbolInit _PRx((Filter filter)); +char *FilterSymbolEnter _PRx((Filter filter, char *s, int *got)); +FilterSymbols FilterSymbolLookup _PRx((Filter filter, char *s)); +int FilterSymbolDefaults _PRx((Filter filter, int enter)); +void FilterSymbolFree _PRx((Filter filter)); + +/* filt.l */ +char *_FilterString _PRx((void)); +void FiltInitParser _PRx((void)); +void FiltScanString _PRx((char *s)); +int FilterRoutineCount _PRx((void)); +int FilterShapeCount _PRx((void)); +int FilterRegionCount _PRx((int type)); +int FilterParseError _PRx((void)); +int FilterTlInfo _PRx((double *tlmins, double *binsizs, int *tltyps)); +char *FilterRadAng _PRx((void)); + +int filterror _PRx((char *msg)); +int filtlex _PRx((void)); +int filtwrap _PRx((void)); +int filtparse _PRx((void)); + +/* filtprog.c */ +int FilterProgStart _PRx((Filter filter)); +int FilterProgOpen _PRx((Filter filter)); +int FilterProgPrepend _PRx((Filter filter)); +int FilterProgWrite _PRx((Filter filter)); +int FilterProgAppend _PRx((Filter filter)); +int FilterProgClose _PRx((Filter filter)); +int FilterProgCompile _PRx((Filter filter)); +int FilterProgEnd _PRx((Filter filter)); +char *FilterLexName _PRx((Filter filter, char *name)); +char *FilterLexRoutine1 _PRx((Filter filter, char *name)); +char *FilterLexRoutine2 _PRx((Filter filter, char *name)); +char *FilterLexRegion1 _PRx((Filter filter, char *name)); +char *FilterLexRegion2 _PRx((Filter filter, char *name)); + +/* filtprog_c.c */ +int FilterProgLoad_C _PRx((Filter filter)); + +/* evregions.c */ +void initevregions _PRx((void)); +/* imregions.c */ +void initimregions _PRx((void)); + +_PRend + +/* for compatibility with funtools */ +#define FilterTable FilterEvents + +#endif /* __filter.h */ |