gp.h

/* $Id: gp_h.html,v 1.1 2001/12/14 21:29:56 jane Exp $ */
#ifndef _GP_INCLUDED
#define _GP_INCLUDED
/* GP dataset interface include file */
#include "cfgprotos.h"
#ifndef GP_READ
#define GP_READ		0		/* GP open options */
#define GP_WRITE	1
#define GP_CLOBBER	1		/* GP create options */
#define GP_NOCLOBBER	0
#define GP_MAX_NAME	31		/* not including trailing \0 */
#define GP_VAR_DIMS	5	/* maximum dimensions per variable */
#define GP_UNLIMITED	0	/* unlimited dimension size */
#define GP_ORIGIN	((int *)0)	/* Var I/O options */
#define GP_ONE		((int *)1)
#define GP_ALL		((int *)2)
#define GP_BYTE		1		/* Fixed width datatypes */
#define GP_SHORT	2
#define GP_LONG		3
#define GP_INT		GP_LONG
#define GP_FLOAT	4
#define GP_REAL		GP_FLOAT
#define GP_DOUBLE	5
#define GP_STRING_MOD	10
#define GP_STRING(x)	(GP_STRING_MOD*(x))	/* (x) width datatype */
#define gpstring(x)	(((x) % GP_STRING_MOD) == 0 && (x) > 0)
#define gpbadtype(x)	((x) < GP_BYTE || ((x) > GP_DOUBLE && !gpstring(x)))
#define GP_MIN_CHAR	0	/* initial min/max values */
#define GP_MAX_CHAR	127
#define GP_MIN_BYTE	0
#define GP_MAX_BYTE	255
#define GP_MIN_SHORT	-32768
#define GP_MAX_SHORT	32767
#define GP_MIN_LONG	(-((int)0x7fffffff) -1)	/* 0x80000000 */
#define GP_MAX_LONG	0x7fffffff
#define GP_MIN_INT	GP_MIN_LONG
#define GP_MAX_INT	GP_MAX_LONG
#define GP_MIN_FLOAT	-3.4028234663852886e+38
#define GP_MAX_FLOAT	3.4028234663852886e+38
#define GP_MIN_REAL	GP_MIN_FLOAT
#define GP_MAX_REAL	GP_MAX_FLOAT
#define GP_MIN_DOUBLE	-1.7976931348623157e+308
#define GP_MAX_DOUBLE	1.7976931348623157e+308
#define GP_BAD_CHAR	0		/* initial bad values */
#define GP_BAD_BYTE	255
#define GP_BAD_SHORT	GP_MIN_SHORT
#define GP_BAD_LONG	GP_MIN_LONG
#define GP_BAD_INT	GP_BAD_LONG
#define GP_BAD_FLOAT	GP_MIN_FLOAT	/* Note bad double = bad float */
#define GP_BAD_REAL	GP_BAD_FLOAT	/* and has exact 32-bit rep !! */
#define GP_BAD_DOUBLE	GP_BAD_FLOAT
#define GP_NO_COORD	0	/* coords for relating dimensions */
#define GP_TIME_COORD	1	/* applications may choose their own */
#define GP_X_COORD	2
#define GP_Y_COORD	3
#define GP_Z_COORD	4
#define GP_COMPLEX_COORD	5
typedef struct GPDIMX {		/* dimension */
  int magic;			/* magic number */
  int id;			/* for identification on disk */
  int unlimited;		/* non-zero (true) iff unlimited */
  int coord;			/* dataset coord; -1 iff none */
  double scale, offset;		/* transform to dataset coord */
  
  char name[GP_MAX_NAME +1];    /* unique across dimensions in dataset */
  int size;			/* current size */
  char *var;			/* VARP pointer to var with values
					NULL if no such var */
  char *owner;			/* SETP pointer to dataset */
  struct GPDIMX *next;		/* pointer to next dimension
					NULL if no more */
} GPDIM;
typedef struct GPFILEX {	/* files */
  int magic;			/* file magic number */
  int id;			/* for identification on disk */
  int fd;			/* file descriptor */
  int readonly;			/* true if not writable */
  struct GPFILEX *next;		/* pointer to next file
					NULL if no more */
  char *owner;			/* SETP pointer to dataset */
  char *path;			/* path to file */
  int pathlen;			/* length of path name, without \0 */
} GPFILE;
typedef struct GPATTX {		/* attribute */
  int magic;			/* attribute magic number */
  int type;			/* valid GP datatype */
  int elemlen;			/* element length */
  int size;			/* number of elements */
				/* if STRING should include trailing \0 */
  char *value;			/* pointer to data in memory */
  int filler;			/* not used; makes struct size 64 */
  char name[GP_MAX_NAME +1];    /* unique across all attributes */
  char units[GP_MAX_NAME +1];	/* initially "\0" */
  char *owner;			/* SETP, VARP, or DIMP */
  struct GPATTX *next;		/* pointer to next attribute of 'owner'
					NULL if no more */
} GPATT;
  
typedef struct GPVARX {		/* variable */
  int magic;			/* variable magic number */
  int id;			/* for identification on disk */
  int type;			/* valid GP datatype */
  int ndims;			/* number in range [1, GP_VAR_DIMS] */
  int elemlen;			/* element length */
  int natts;			/* number of user defined attributes */
  GPATT *att;			/* pointer to linked list of attrs */
  GPDIM *dim[GP_VAR_DIMS];	/* list of dimensions */
                                /* sizes are dim[0]->len, ... */
  
  char name[GP_MAX_NAME +1];
  char units[GP_MAX_NAME +1];	/* initially "\0" */
  double scale, offset;		/* actual = scale*stored + offset */
				/* initially scale = 1, offset = 0 */
  double badval;		/* bad or missing stored value */
  double usemin, usemax;	/* ignore stored values outside [min, max] */
  GPFILE *file;			/* file containing data */
  int dimdist[GP_VAR_DIMS];	/* distance between dimensions */
  int datastart;		/* offset to first element in file */
  char *owner;			/* SETP pointer to dataset */
  struct GPVARX *next;		/* pointer to next variable
					NULL if no more */
  struct GPVARX *recvar;	/* First variable in dataset with same leading
				   dim whose data overlaps this var's data */
} GPVAR;
typedef struct GPRELX {		/* relation */
  int magic;			/* relation magic number */
  int id;			/* for identification on disk */
  int nvars;			/* number of variables in relation */
  GPVAR **var;			/* array of related variables */
  int natts;			/* number of relation attributes */
  GPATT *att;			/* pointer to first attribute */
  char name[GP_MAX_NAME +1];
  char kind[GP_MAX_NAME +1];	/* analogous to variable units */
  char *owner;			/* SETP pointer to dataset */
  struct GPRELX *next;		/* pointer to next relation 
					NULL if no more */
} GPREL;
typedef struct GPSETX {	/* dataset */
  int magic;		/* magic number */
  short version;	/* implementation version */
  short status;		/* dataset status */
  int ndims;		/* number of dimensions */
  int natts;		/* number of attributes */
  int nvars;		/* number of variables */
  int nrels;		/* number of relations */
  int nfiles;		/* number of files (always > 0) */
  int nrecs;		/* size of current unlimited dim */
  int reclen;		/* if var v has unlimited leading dim */
			/*  then v[i,0,...0] and v[i+1,0,...0] */
			/*  are reclen bytes apart */
  int defstart;		/* offset in file to defs */
  GPDIM *dim;		/* pointer to first dimension */
  GPVAR *var;		/* pointer to first variable */
  GPREL *rel;		/* pointer to first relation */
  GPATT *att;		/* pointer to first attribute */
  GPFILE *file;		/* pointer to first file
				first file is always self */
  struct GPSETX *next;	/* pointer to next dataset
				NULL if no more */
} GPSET;
typedef GPSET *SETP;		/* Pointers to structures */
typedef GPDIM *DIMP;
typedef GPATT *ATTP;
typedef GPVAR *VARP;
typedef GPREL *RELP;
typedef GPFILE *FILP;
__BEGIN_DECLS
#ifndef GPERR
extern void (*gperr)(		/* pointer to error handling function */
int code,
SETP set,
void *ptr,
char *name
);
#endif
#ifdef GPOPEN
SETP gpfirstset = 0;		/* First in linked list of sets */
int (*gplinkread)() = 0;
int (*gplinkopen)() = 0;
int (*gplinkclose)() = 0;
#else
extern SETP gpfirstset;
extern int (*gplinkread)( VARP var, int start[], int count[], char *value);
extern int (*gplinkopen)( char *, char *);
extern int (*gplinkclose)( int fd);
#endif
__END_DECLS
#define GP_SET_MAGIC	0xf0f1f2f3
#define GP_DIM_MAGIC	0xa0b1c2d3
#define GP_VAR_MAGIC	0xa4b5c6d7
#define GP_ATT_MAGIC	0xa8b9dadb
#define GP_FILE_MAGIC	0xacbdcedf
#define GP_REL_MAGIC	0xb0c1d2e3
#define GP_STATUS_WRITE		0x01	/* Status codes */
#define GP_STATUS_CREATE	0x02
#define GP_STATUS_TRASHED	0x04
#define GP_STATUS_TEMPCOPY	0x08
#define GP_STATUS_PUTBUFOK	0x10
#ifdef GPLIB
#ifndef NULL
#define NULL	0
#endif
#define GP_VERSION	100		/* 1.00 */
#define GP_PTR	GP_MIN_SHORT		/* Internal type */
#define GP_UNTRIED_FD	-3		/* Have not tried to open yet */
#define GP_HOLLOW_FD	-2		/* Essentially a null file */
#define GP_FAILED_FD	-1		/* UNIX open() failed return */
#define GP_COMPRESS_LINK_CHAR	'!'
#define GP_PROCESS_LINK_CHAR	';'
#define testmagic(ptr,retval,magic,error)	\
 if (gpmagic(ptr) != magic) { (*gperr)(error, 0, 0, 0); return(retval); }
#define gptestset(x,y)	testmagic(x, y, GP_SET_MAGIC, EGP_BAD_SET_PTR)
#define gptestdim(x,y)	testmagic(x, y, GP_DIM_MAGIC, EGP_BAD_DIM_PTR)
#define gptestvar(x,y)	testmagic(x, y, GP_VAR_MAGIC, EGP_BAD_VAR_PTR)
#define gptestatt(x,y)	testmagic(x, y, GP_ATT_MAGIC, EGP_BAD_ATT_PTR)
#define gptestfile(x,y)	testmagic(x, y, GP_FILE_MAGIC,EGP_BAD_FILE_PTR)
#define gptestrel(x,y)	testmagic(x, y, GP_REL_MAGIC, EGP_BAD_REL_PTR)
#define gpallocatt(x)	(ATTP)gpalloc(sizeof(GPATT)+x)
#define gpallocvar()	(VARP)gpalloc(sizeof(GPVAR))
#define gpallocdim()	(DIMP)gpalloc(sizeof(GPDIM))
#define gpallocfile(x)	(FILP)gpalloc(sizeof(GPFILE)+x)
#define gpallocrel(x)	(RELP)gpalloc(sizeof(GPREL)+x)
#define gpallocset()	(SETP)gpalloc(sizeof(GPSET))
#define gpfreeatt(a)	gpfree((char *)(a),sizeof(GPATT) + (a)->elemlen * (a)->size)
#define gpfreevar(v)	gpfree((char *)(v),sizeof(GPVAR))
#define gpfreedim(d)	gpfree((char *)(d),sizeof(GPDIM))
#define gpfreefile(f)	gpfree((char *)(f),sizeof(GPFILE) + (f)->pathlen +1)
#define gpfreerel(r)	gpfree((char *)(r),sizeof(GPREL) + (r)->nvars * sizeof(VARP))
#define gpfreeset(g)	gpfree((char *)(g),sizeof(GPSET))
#define GP_DATASTART	644		/* Historical */
#endif
#define EGP_ERROR		750
#define EGP_BAD_MAGIC		751	/* Invalid or corrupt dataset */
#define EGP_BAD_DATATYPE	752
#define EGP_DUP_NAME		753
#define EGP_NOT_GP_SET		754	/* Not a dataset */
#define EGP_BAD_LENGTH		755
#define EGP_BAD_NAME		756
#define EGP_BAD_DIM_SIZE	761
#define EGP_DIM_OUTSIDE_SET	762	/* Var can't have dim outside set */
#define EGP_DIM_STILL_USED	763	/* Dim still used by a variable */
#define EGP_LINK_DIM_MISMATCH	764
#define EGP_LINK_OPEN		765	/* Can't open linked file */
#define EGP_UNCOMPRESS		766	/* Auto uncompress error  */
#define EGP_LINK_BUSY		767	/* Can't remove link if busy */
#define EGP_LINK_SELF		768	/* Can't link to self */
#define EGP_NO_SUCH_ATT		771
#define EGP_NO_SUCH_DIM		772
#define EGP_NO_SUCH_VAR		773
#define EGP_NO_SUCH_REL		774
#define EGP_NO_SUCH_FILE	775
#define EGP_SHORT_READ		776	/* Usually means corrupt dataset */
#define EGP_SHORT_WRITE		777	/* Usually means disk full */
#define EGP_BAD_REL_NVARS	778
#define EGP_VAR_OUTSIDE_SET	779
#define EGP_NUM_VAR_DIMS	781	/* Bad # variable dimensions */
#define EGP_VAR_DIM_BOUNDS	782	/* Hypercube outside var bounds */
#define EGP_VAR_DIM_MISMATCH	783
#define EGP_VAR_DIM_SIZE	784	/* Non-lead dim can't be growing */
#define EGP_VAR_READONLY	785
#define EGP_VAR_STILL_USED	786
#define EGP_BAD_SET_PTR		791
#define EGP_BAD_FILE_PTR	792
#define EGP_BAD_ATT_PTR		793
#define EGP_BAD_DIM_PTR		794
#define EGP_BAD_VAR_PTR		795
#define EGP_BAD_REL_PTR		796
/* PROTOTYPES */
__BEGIN_DECLS
#ifdef GPLIB
int GPdelatt( ATTP att);
ATTP GPcopyatt( void *p, ATTP att);
ATTP GPatt( void *p, char *name);
DIMP GPdefdim( SETP gp, char *name, int len);
DIMP GPdim( SETP gp, char *name);
void GPerr( int code, SETP gp, void *p, char *name);
RELP GPdefrel( SETP gp, char *name, int nvars, VARP var[]);
RELP GPrel( SETP gp, char *name);
int GPtypelen( int type);
void GPabandon( SETP gp);
int GPsync( SETP gp);
int GPownatt( void *p, ATTP att);
int GPownrel( SETP set, RELP rel);
int GPownvar( SETP set, VARP var);
int GPowndim( SETP set, DIMP dim);
int GPownfile( SETP set, FILP file);
VARP GPdefvar( SETP gp, char *name, int type, int ndims, DIMP dim[], int link);
int GPcpvaratt( VARP var, VARP outvar);
VARP GPvar( SETP gp, char *name);
VARP GPrecvar( VARP var);
#endif /* GPLIB */
SETP cdf2gp( char *path, int fd, int option, int *cdfmt);
ATTP gpdefatt( void *p, char *name, int type, int len, void *value);
ATTP gpatt( void *p, char *name);
int gpgetatt( void *p, char *name, void *value);
ATTP gpcopyatt( void *to, ATTP att);
int gpdelatt( ATTP att);
int gpgetbuf( VARP var, int start[], int count[], void *value);
int gpresetbuf( SETP gp);
int gpcache( char *path, int option, char **newpath);
DIMP gpdefdim( SETP gp, char *name, int len);
DIMP gpdim( SETP gp, char *name);
DIMP gpclonedim( SETP gp, DIMP dim, char *name);
int gpdeldim( DIMP dim);
int gpgetvar( VARP var, int *start, int *count, void *value);
int gpputvar( VARP var, int *start, int *count, void *value);
int gpgetscaled( VARP var, int *start, int *count, void *value);
int gpputscaled( VARP var, int *start, int *count, void *value);
VARP gplinkvar( SETP gp, VARP var, int *start, int *count, char *name);
VARP gplinkvar2( SETP gp, VARP var, int *start, int *count,
  int *delta, DIMP *d, char *name);
VARP gplinkext( SETP gp, char *name, int type, int ndims, DIMP dim[],
  char *path, int datastart, int contig, int reclen);
int gpmvlink( SETP gp, char *old, char *);
char *gpalloc( int size);
void gpfree( void *ptr, int size);
int gpmagic( void *p);
RELP gpdefrel( SETP gp, char *name, int nvars, VARP var[]);
RELP gprel( SETP gp, char *name);
RELP gpclonerel( SETP gp, RELP rel, char *name);
int gpdelrel( RELP rel);
int gpsamename( char *name1, char *name2);
int gpsamedims( VARP var1, VARP var2);
int gpsamesize( VARP var1, VARP var2);
int gpfixdim( DIMP dim, int size, int maxsize);
int gpbumpdim( DIMP dim);
int gptypelen( int type);
void gpputname( char *dest, char *name);
SETP gpopen( char *path, int option);
SETP gpcreate( char *path, int option);
SETP gpclone( SETP gp, char *path, int option);
int gpclose( SETP gp);
int gpsync( SETP gp);
int gpscrollsync( SETP gp, int offset);
int gpscrollhdr( SETP gp, int holesize);
int gpabort( SETP gp);
VARP gpdefvar( SETP gp, char *name, int type, int ndims, DIMP dim[]);
VARP gpvar( SETP gp, char *name);
VARP gpclonevar( SETP gp, VARP var, char *name);
int gpdelvar( VARP var);
int gpcpvaratt( VARP var, VARP outvar);
int gpvardims( VARP var, int ndims, DIMP dim[]);
int gpbufwrite( SETP set);
int gpclipdim(DIMP dim, int start, int count);
int gppack(SETP set);
/* XDR prototypes */
int GP_struct_export_len ( int templte[] );
void GP_import_struct ( char *data, int templte[] );
char *GP_export_struct ( char *data, int templte[] );
void GP_import_array ( char *data, int type, int n );
void GP_export_array ( char *data, int type, int n );
/* HISTORY PROTOTYPES */
ATTP gphistdef( SETP set);
int gphistprms( SETP set);
int gphistadd( SETP set, char *text, int len);
int gphistxfer( SETP from, SETP dest, char *path);
int gphistdel( SETP set);
__END_DECLS
#endif
#endif		/* #ifndef _GP_INCLUDED */

Last Update: $Date: 2001/12/14 21:29:56 $