1/*********************************************************************
2 *   Copyright 2010, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *********************************************************************/
5
6/* $Id: ncdispatch.h,v 1.18 2010/06/01 20:11:59 dmh Exp $ */
7/* $Header: /upc/share/CVS/netcdf-3/libdispatch/ncdispatch.h,v 1.18 2010/06/01 20:11:59 dmh Exp $ */
8
9#ifndef _DISPATCH_H
10#define _DISPATCH_H
11
12#include "config.h"
13#include <stdlib.h>
14#include <stdio.h>
15#include <string.h>
16#include <assert.h>
17#if defined(HDF5_PARALLEL) || defined(USE_PNETCDF)
18#include <mpi.h>
19#endif
20#ifdef USE_PARALLEL
21#include "netcdf_par.h"
22#endif
23#include "netcdf.h"
24#include "nc.h"
25#include "ncuri.h"
26
27#define longtype ((sizeof(long) == sizeof(int) ? NC_INT : NC_INT64))
28
29#define X_INT_MAX 2147483647
30
31/* Given a filename, check its magic number */
32#define MAGIC_NUMBER_LEN 4
33#define MAGIC_HDF5_FILE 1
34#define MAGIC_HDF4_FILE 2
35#define MAGIC_CDF1_FILE 1 /* std classic format */
36#define MAGIC_CDF2_FILE 2 /* classic 64 bit */
37
38/* Define the mappings from fcn name types
39   to corresponding NC types. */
40#define T_text   NC_CHAR
41#define T_schar  NC_BYTE
42#define T_char   NC_CHAR
43#define T_short  NC_SHORT
44#define T_int    NC_INT
45#define T_float  NC_FLOAT
46#define T_double NC_DOUBLE
47#define T_ubyte  NC_UBYTE
48#define T_ushort NC_USHORT
49#define T_uint   NC_UINT
50#define T_longlong  NC_INT64
51#define T_ulonglong  NC_UINT64
52#ifdef USE_NETCDF4
53#define T_string NC_STRING
54#endif
55
56/* Synthetic type to handle special memtypes */
57#define T_uchar  NC_UBYTE
58#define T_long   longtype
59#define T_ulong   ulongtype
60
61/**************************************************/
62#if 0
63/* Define the known classes of dispatchers */
64/* Flags may be or'd => powers of 2*/
65#define NC_DISPATCH_NC3    1
66#define NC_DISPATCH_NC4    2
67#define NC_DISPATCH_NCD    4
68#define NC_DISPATCH_NCP    8
69#endif
70
71/* Define a type for use when doing e.g. nc_get_vara_long, etc. */
72/* Should matche values in libsrc4/netcdf.h */
73#ifndef NC_UINT64
74#define NC_UBYTE  7 /* unsigned 1 byte int */
75#define NC_USHORT  8 /* unsigned 2-byte int */
76#define NC_UINT  9 /* unsigned 4-byte int */
77#define NC_INT64  10 /* signed 8-byte int */
78#define NC_UINT64  11 /* unsigned 8-byte int */
79#define NC_STRING  12 /* char* */
80#endif
81
82/* Define the range of Atomic types */
83#define ATOMICTYPEMAX4 NC_STRING
84#define ATOMICTYPEMAX3 NC_DOUBLE
85#define ATOMICTYPEMAX5 NC_UINT64
86
87/* Define an alias for int to indicate an error return */
88typedef int NCerror;
89
90#if !defined HDF5_PARALLEL && !defined USE_PNETCDF
91typedef int MPI_Comm;
92typedef int MPI_Info;
93#define MPI_COMM_WORLD 0
94#define MPI_INFO_NULL 0
95#endif
96
97/* Define a struct to hold the MPI info so it can be passed down the
98 * call stack. This is used internally by the netCDF library. It
99 * should not be used by netcdf users. */
100typedef struct NC_MPI_INFO {
101    MPI_Comm comm;
102    MPI_Info info;
103NC_MPI_INFO;
104
105typedef struct NC_MEM_INFO {
106    size_t size;
107    void* memory;
108NC_MEM_INFO;
109
110/* Define known dispatch tables and initializers */
111
112/*Forward*/
113typedef struct NC_Dispatch NC_Dispatch;
114
115extern int NCDISPATCH_initialize(void);
116extern int NCDISPATCH_finalize(void);
117
118extern NC_DispatchNC3_dispatch_table;
119extern int NC3_initialize(void);
120extern int NC3_finalize(void);
121
122#ifdef USE_DAP
123extern NC_DispatchNCD2_dispatch_table;
124extern int NCD2_initialize(void);
125extern int NCD2_finalize(void);
126#endif
127
128#ifdef USE_PNETCDF
129extern NC_DispatchNCP_dispatch_table;
130extern int NCP_initialize(void);
131extern int NCP_finalize(void);
132#endif
133
134#ifdef USE_NETCDF4
135extern NC_DispatchNC4_dispatch_table;
136extern int NC4_initialize(void);
137extern int NC4_finalize(void);
138#endif
139
140#ifdef USE_DAP
141extern NC_DispatchNCD4_dispatch_table;
142extern int NCD4_initialize(void);
143extern int NCD4_finalize(void);
144#endif
145
146/* Vectors of ones and zeros */
147extern size_t nc_sizevector0[NC_MAX_VAR_DIMS];
148extern size_t nc_sizevector1[NC_MAX_VAR_DIMS];
149extern ptrdiff_t nc_ptrdiffvector1[NC_MAX_VAR_DIMS];
150
151/**************************************************/
152/* Forward */
153#ifndef USE_NETCDF4
154/* Taken from libsrc4/netcdf.h */
155struct nc_vlen_t;
156#define NC_NETCDF4 0x1000
157#define NC_CLASSIC_MODEL 0x0100
158#define NC_ENOPAR (-114)
159#endif /*!USE_NETCDF4*/
160
161struct NC;
162
163
164int NC_create(const char *path, int cmode,
165       size_t initialsz, int basepe, size_t *chunksizehintp,
166       int useparallel, void* parameters,
167       int *ncidp);
168int NC_open(const char *path, int cmode,
169     int basepe, size_t *chunksizehintp,
170     int useparallel, void* parameters,
171     int *ncidp);
172
173/* Expose the default vars and varm dispatch entries */
174extern int NCDEFAULT_get_vars(int, int, const size_t*,
175        const size_t*, const ptrdiff_t*, void*, nc_type);
176extern int NCDEFAULT_put_vars(int, int, const size_t*,
177        const size_t*, const ptrdiff_t*, const void*, nc_type);
178extern int NCDEFAULT_get_varm(int, int, const size_t*,
179               const size_t*, const ptrdiff_t*, const ptrdiff_t*,
180               void*, nc_type);
181extern int NCDEFAULT_put_varm(int, int, const size_t*,
182               const size_t*, const ptrdiff_t*, const ptrdiff_t*,
183               const void*, nc_type);
184
185/**************************************************/
186/* Forward */
187struct NCHDR;
188
189struct NC_Dispatch {
190
191int model; /* one of the NC_FORMATX #'s */
192
193int (*create)(const char *path, int cmode,
194   size_t initialsz, int basepe, size_t *chunksizehintp,
195   int use_parallel, void* parameters,
196   struct NC_DispatchtableNCncp);
197int (*open)(const char *path, int mode,
198     int basepe, size_t *chunksizehintp,
199     int use_parallel, void* parameters,
200     struct NC_DispatchtableNCncp);
201
202int (*redef)(int);
203int (*_enddef)(int,size_t,size_t,size_t,size_t);
204int (*sync)(int);
205int (*abort)(int);
206int (*close)(int);
207int (*set_fill)(int,int,int*);
208int (*inq_base_pe)(int,int*);
209int (*set_base_pe)(int,int);
210int (*inq_format)(int,int*);
211int (*inq_format_extended)(int,int*,int*);
212
213int (*inq)(int,int*,int*,int*,int*);
214int (*inq_type)(int, nc_type, char*, size_t*);
215
216int (*def_dim)(int, const char*, size_t, int*);
217int (*inq_dimid)(int, const char*, int*);
218int (*inq_dim)(int, int, char*, size_t*);
219int (*inq_unlimdim)(int ncid,  int *unlimdimidp);
220int (*rename_dim)(int, int, const char*);
221
222int (*inq_att)(int, int, const char*, nc_type*, size_t*);
223int (*inq_attid)(int, int, const char*, int*);
224int (*inq_attname)(int, int, int, char*);
225int (*rename_att)(int, int, const char*, const char*);
226int (*del_att)(int, int, const char*);
227int (*get_att)(int, int, const char*, void*, nc_type);
228int (*put_att)(int, int, const char*, nc_type, size_t, const void*, nc_type);
229
230int (*def_var)(int, const char*, nc_type, int, const int*, int*);
231int (*inq_varid)(int, const char*, int*);
232int (*rename_var)(int, int, const char*);
233
234int (*get_vara)(int, int, const size_t*, const size_t*, void*, nc_type);
235int (*put_vara)(int, int, const size_t*, const size_t*, const void*, nc_type);
236
237/* Added to solve Ferret performance problem with Opendap */
238int (*get_vars)(int, int, const size_t*, const size_t*, const ptrdiff_t*, void*, nc_type);
239int (*put_vars)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const void*, nc_type);
240
241int (*get_varm)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const ptrdiff_t*, void*, nc_type);
242int (*put_varm)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const ptrdiff_t*, const void*, nc_type);
243
244int (*inq_var_all)(int ncid, int varid, char *namenc_type *xtypep,
245               int *ndimsp, int *dimidsp, int *nattsp,
246               int *shufflep, int *deflatep, int *deflate_levelp,
247               int *fletcher32p, int *contiguousp, size_t *chunksizesp,
248               int *no_fill, void *fill_valuep, int *endiannessp,
249        int *options_maskp, int *pixels_per_blockp);
250
251int (*var_par_access)(int, int, int);
252
253/* Note the following may still be invoked by netcdf client code
254   even when the file is a classic file; they will just return an error or
255   be ignored.
256*/
257#ifdef USE_NETCDF4
258int (*show_metadata)(int);
259int (*inq_unlimdims)(int, int*, int*);
260int (*inq_ncid)(int, const char*, int*);
261int (*inq_grps)(int, int*, int*);
262int (*inq_grpname)(int, char*);
263int (*inq_grpname_full)(int, size_t*, char*);
264int (*inq_grp_parent)(int, int*);
265int (*inq_grp_full_ncid)(int, const char*, int*);
266int (*inq_varids)(int, int* nvars, int*);
267int (*inq_dimids)(int, int* ndims, int*, int);
268int (*inq_typeids)(int, int* ntypes, int*);
269int (*inq_type_equal)(int, nc_type, int, nc_type, int*);
270int (*def_grp)(int, const char*, int*);
271int (*rename_grp)(int, const char*);
272int (*inq_user_type)(int, nc_type, char*, size_t*, nc_type*, size_t*, int*);
273int (*inq_typeid)(int, const char*, nc_type*);
274
275int (*def_compound)(int, size_t, const char*, nc_type*);
276int (*insert_compound)(int, nc_type, const char*, size_t, nc_type);
277int (*insert_array_compound)(int, nc_type, const char*, size_t, nc_type, int, const int*);
278int (*inq_compound_field)(int, nc_type, int, char*, size_t*, nc_type*, int*, int*);
279int (*inq_compound_fieldindex)(int, nc_type, const char*, int*);
280int (*def_vlen)(int, const char*, nc_type base_typeidnc_type*);
281int (*put_vlen_element)(int, int, void*, size_t, const void*);
282int (*get_vlen_element)(int, int, const void*, size_t*, void*);
283int (*def_enum)(int, nc_type, const char*, nc_type*);
284int (*insert_enum)(int, nc_type, const char*, const void*);
285int (*inq_enum_member)(int, nc_type, int, char*, void*);
286int (*inq_enum_ident)(int, nc_type, long long, char*);
287int (*def_opaque)(int, size_t, const char*, nc_type*);
288int (*def_var_deflate)(int, int, int, int, int);
289int (*def_var_fletcher32)(int, int, int);
290int (*def_var_chunking)(int, int, int, const size_t*);
291int (*def_var_fill)(int, int, int, const void*);
292int (*def_var_endian)(int, int, int);
293int (*set_var_chunk_cache)(int, int, size_t, size_t, float);
294int (*get_var_chunk_cache)(int ncid, int varid, size_t *sizep, size_t *nelemsp, float *preemptionp);
295#endif /*USE_NETCDF4*/
296
297};
298
299/* Following functions must be handled as non-dispatch */
300#ifdef NONDISPATCH
301void (*nc_advise)(const char*cdf_routine_name,interr,const char*fmt,...);
302void (*nc_set_log_level)(int);
303const char* (*nc_inq_libvers)(void);
304const char* (*nc_strerror)(int);
305int (*nc_delete)(const char*path);
306int (*nc_delete_mp)(const char*path,intbasepe);
307int (*nc_initialize)();
308int (*nc_finalize)();
309#endif /*NONDISPATCH*/
310
311/* Define the common fields for NC and NC_FILE_INFO_T etc */
312typedef struct NCcommon {
313 int ext_ncid; /* uid << 16 */
314 int int_ncid; /* unspecified other id */
315 struct NC_Dispatchdispatch;
316 void* dispatchdata; /* per-protocol instance data */
317 char* path; /* as specified at open or create */
318NCcommon;
319
320extern size_t NC_atomictypelen(nc_type xtype);
321extern char* NC_atomictypename(nc_type xtype);
322
323#ifdef OBSOLETE
324/* Provide a dispatch table overlay facility */
325extern int NC_dispatch_overlay(const NC_Dispatchoverlay,
326                                        const NC_Dispatchbase,
327 NC_Dispatchmerge);
328
329/* Get/set the override dispatch table */
330extern NC_DispatchNC_get_dispatch_override(void);
331extern void NC_set_dispatch_override(NC_Dispatch*);
332#endif
333
334/* Does the path look like a url? */
335extern int NC_testurl(const char* path);
336/* Return model (0 or 3 or 4) as specified by the url */
337extern int NC_urlmodel(const char* path);
338
339/* allow access url parse and params without exposing nc_url.h */
340extern int NCDAP_urlparse(const char* s, void** dapurl);
341extern void NCDAP_urlfree(void* dapurl);
342extern const char* NCDAP_urllookup(void* dapurl, const char* param);
343
344/* Test for specific set of servers */
345#if defined(DLL_NETCDF) /* Defined when library is a DLL */
346# if defined(DLL_EXPORT) /* Define when building the library. */
347#  define MSC_NCDISPATCH_EXTRA __declspec(dllexport)
348# else
349#  define MSC_NCDISPATCH_EXTRA __declspec(dllimport)
350# endif
351#else
352#  define MSC_NCDISPATCH_EXTRA
353#endif
354
355#define NCD_EXTERNL MSC_NCDISPATCH_EXTRA extern
356
357NCD_EXTERNL char* NC_findtestserver(const char*, const char**);
358NCD_EXTERNL int nc_open_mem(const char*, int, size_t, void*, int*);
359NCD_EXTERNL int nc_finalize();
360
361/* Ping a specific server */
362extern int NCDAP_ping(const char*);
363
364/* Misc */
365
366extern int NC_getshape(int ncid, int varid, int ndims, size_t* shape);
367extern int NC_is_recvar(int ncid, int varid, size_t* nrecs);
368extern int NC_inq_recvar(int ncid, int varid, int* nrecdims, int* is_recdim);
369
370#define nullstring(s) (s==NULL?"(null)":s)
371
372
373#undef TRACECALLS
374#ifdef TRACECALLS
375#include <stdio.h>
376#define TRACE(fname) fprintf(stderr,"call: %s\n",#fname)
377#else
378#define TRACE(fname)
379#endif
380
381extern size_t NC_coord_zero[NC_MAX_VAR_DIMS];
382extern size_t NC_coord_one[NC_MAX_VAR_DIMS];
383
384extern int NC_argc;
385extern char* NC_argv[];
386extern int NC_initialized;
387
388NCD_EXTERNL int nc_initialize();
389
390
391/**
392Certain functions are in the dispatch table,
393but not in the netcdf.h API. These need to
394be exposed for use in delegation such as
395in libdap2.
396*/
397extern int
398NCDISPATCH_inq_var_all(int ncid, int varid, char *namenc_type *xtypep,
399               int *ndimsp, int *dimidsp, int *nattsp,
400               int *shufflep, int *deflatep, int *deflate_levelp,
401               int *fletcher32p, int *contiguousp, size_t *chunksizesp,
402               int *no_fill, void *fill_valuep, int *endiannessp,
403        int *options_maskp, int *pixels_per_blockp);
404
405extern int
406NCDISPATCH_get_att(int ncid, int varid, const char* name, void* valuenc_type t);
407
408#endif /* _DISPATCH_H */


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed