/* $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 $