1 /*********************************************************************
2  *   Copyright 2010, UCAR/Unidata
3  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4  *********************************************************************/
5 
6 #include "config.h"
7 
8 #ifdef USE_PARALLEL
9 #include <mpi.h>
10 #endif
11 
12 #include "ncdispatch.h"
13 
14 
15 extern int NC3_initialize(void);
16 extern int NC3_finalize(void);
17 
18 #ifdef USE_NETCDF4
19 #include "nc4internal.h"
20 extern int NC4_initialize(void);
21 extern int NC4_finalize(void);
22 #endif
23 
24 #ifdef ENABLE_DAP2
25 extern int NCD2_initialize(void);
26 extern int NCD2_finalize(void);
27 #endif
28 
29 #ifdef ENABLE_DAP4
30 extern int NCD4_initialize(void);
31 extern int NCD4_finalize(void);
32 #endif
33 
34 #ifdef USE_PNETCDF
35 extern int NCP_initialize(void);
36 extern int NCP_finalize(void);
37 #endif
38 
39 #ifdef USE_HDF4
40 extern int NC_HDF4_initialize(void);
41 extern int NC_HDF4_finalize(void);
42 #endif
43 
44 #ifdef _MSC_VER
45 #include <io.h>
46 #include <fcntl.h>
47 #endif
48 
49 int NC_argc = 1;
50 char* NC_argv[] = {"nc_initialize",NULL};
51 
52 int NC_initialized = 0;
53 int NC_finalized = 1;
54 
55 /**
56 This procedure invokes all defined
57 initializers, and there is an initializer
58 for every known dispatch table.
59 So if you modify the format of NC_Dispatch,
60 then you need to fix it everywhere.
61 It also initializes appropriate external libraries.
62 */
63 
64 int
nc_initialize()65 nc_initialize()
66 {
67     int stat = NC_NOERR;
68 
69     if(NC_initialized) return NC_NOERR;
70     NC_initialized = 1;
71     NC_finalized = 0;
72 
73     /* Do general initialization */
74     if((stat = NCDISPATCH_initialize())) goto done;
75 
76     /* Initialize each active protocol */
77     if((stat = NC3_initialize())) goto done;
78 #ifdef ENABLE_DAP
79     if((stat = NCD2_initialize())) goto done;
80 #endif
81 #ifdef ENABLE_DAP4
82     if((stat = NCD4_initialize())) goto done;
83 #endif
84 #ifdef USE_PNETCDF
85     if((stat = NCP_initialize())) goto done;
86 #endif
87 #ifdef USE_HDF4
88     if((stat = NC_HDF4_initialize())) goto done;
89 #endif
90 #ifdef USE_NETCDF4
91     if((stat = NC4_initialize())) goto done;
92     stat = NC4_provenance_init();
93 #endif /* USE_NETCDF4 */
94 
95 done:
96     return stat;
97 }
98 
99 /**
100 This procedure invokes all defined
101 finalizers, and there should be one
102 for every known dispatch table.
103 So if you modify the format of NC_Dispatch,
104 then you need to fix it everywhere.
105 It also finalizes appropriate external libraries.
106 */
107 
108 int
nc_finalize(void)109 nc_finalize(void)
110 {
111     int stat = NC_NOERR;
112 
113     if(NC_finalized) return NC_NOERR;
114     NC_initialized = 0;
115     NC_finalized = 1;
116 
117     /* Finalize each active protocol */
118 
119 #ifdef ENABLE_DAP2
120     if((stat = NCD2_finalize())) return stat;
121 #endif
122 #ifdef ENABLE_DAP4
123     if((stat = NCD4_finalize())) return stat;
124 #endif
125 
126 #ifdef USE_PNETCDF
127     if((stat = NCP_finalize())) return stat;
128 #endif
129 
130 #ifdef USE_HDF4
131     if((stat = NC_HDF4_finalize())) return stat;
132 #endif /* USE_HDF4 */
133 
134 #ifdef USE_NETCDF4
135     if((stat = NC4_finalize())) return stat;
136 #endif /* USE_NETCDF4 */
137 
138     if((stat = NC3_finalize())) return stat;
139 
140     /* Do general finalization */
141     if((stat = NCDISPATCH_finalize())) return stat;
142 
143     return NC_NOERR;
144 }
145