1/** \file
2Error messages and library version.
3
4These functions return the library version, and error messages.
5
6Copyright 2010 University Corporation for Atmospheric
7Research/Unidata. See COPYRIGHT file for more info.
8*/
9
10#include "ncdispatch.h"
11#ifdef USE_PNETCDF
12#include <pnetcdf.h>  /* for ncmpi_strerror() */
13#endif
14
15/* Tell the user the version of netCDF. */
16static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $";
17
18/**
19\defgroup lib_version Library Version
20  Functions related to querying the library version.
21
22  Return the library version.
23
24  \returns short string that contains the version information for the
25library.
26 */
27const char *
28nc_inq_libvers(void)
29{
30   return nc_libvers;
31}
32
33/*! NetCDF Error Handling
34
35\addtogroup error NetCDF Error Handling
36
37NetCDF functions return a non-zero status codes on error.
38
39Each netCDF function returns an integer status value. If the returned
40status value indicates an error, you may handle it in any way desired,
41from printing an associated error message and exiting to ignoring the
42error indication and proceeding (not recommended!). For simplicity,
43the examples in this guide check the error status and call a separate
44function, handle_err(), to handle any errors. One possible definition
45of handle_err() can be found within the documentation of
46nc_strerror().
47
48The nc_strerror() function is available to convert a returned integer
49error status into an error message string.
50
51Occasionally, low-level I/O errors may occur in a layer below the
52netCDF library. For example, if a write operation causes you to exceed
53disk quotas or to attempt to write to a device that is no longer
54available, you may get an error from a layer below the netCDF library,
55but the resulting write error will still be reflected in the returned
56status value.
57
58*/
59
60/** \{ */
61
62/*! Given an error number, return an error message.
63
64This function returns a static reference to an error message string
65corresponding to an integer netCDF error status or to a system error
66number, presumably returned by a previous call to some other netCDF
67function. The error codes are defined in netcdf.h.
68
69\param ncerr1 error number
70
71\returns short string containing error message.
72
73Here is an example of a simple error handling function that uses
74nc_strerror() to print the error message corresponding to the netCDF
75error status returned from any netCDF function call and then exit:
76
77\code
78     #include <netcdf.h>
79        ...
80     void handle_error(int status) {
81     if (status != NC_NOERR) {
82        fprintf(stderr, "%s\n", nc_strerror(status));
83        exit(-1);
84        }
85     }
86\endcode
87*/
88const char *nc_strerror(int ncerr1)
89{
90   /* System error? */
91   if(NC_ISSYSERR(ncerr1))
92   {
93      const char *cp = (const char *) strerror(ncerr1);
94      if(cp == NULL)
95  return "Unknown Error";
96      return cp;
97   }
98
99   /* If we're here, this is a netcdf error code. */
100   switch(ncerr1)
101   {
102      case NC_NOERR:
103  return "No error";
104      case NC_EBADID:
105  return "NetCDF: Not a valid ID";
106      case NC_ENFILE:
107  return "NetCDF: Too many files open";
108      case NC_EEXIST:
109  return "NetCDF: File exists && NC_NOCLOBBER";
110      case NC_EINVAL:
111  return "NetCDF: Invalid argument";
112      case NC_EPERM:
113  return "NetCDF: Write to read only";
114      case NC_ENOTINDEFINE:
115  return "NetCDF: Operation not allowed in data mode";
116      case NC_EINDEFINE:
117  return "NetCDF: Operation not allowed in define mode";
118      case NC_EINVALCOORDS:
119  return "NetCDF: Index exceeds dimension bound";
120      case NC_EMAXDIMS:
121  return "NetCDF: NC_MAX_DIMS exceeded";
122      case NC_ENAMEINUSE:
123  return "NetCDF: String match to name in use";
124      case NC_ENOTATT:
125  return "NetCDF: Attribute not found";
126      case NC_EMAXATTS:
127  return "NetCDF: NC_MAX_ATTRS exceeded";
128      case NC_EBADTYPE:
129  return "NetCDF: Not a valid data type or _FillValue type mismatch";
130      case NC_EBADDIM:
131  return "NetCDF: Invalid dimension ID or name";
132      case NC_EUNLIMPOS:
133  return "NetCDF: NC_UNLIMITED in the wrong index";
134      case NC_EMAXVARS:
135  return "NetCDF: NC_MAX_VARS exceeded";
136      case NC_ENOTVAR:
137  return "NetCDF: Variable not found";
138      case NC_EGLOBAL:
139  return "NetCDF: Action prohibited on NC_GLOBAL varid";
140      case NC_ENOTNC:
141  return "NetCDF: Unknown file format";
142      case NC_ESTS:
143  return "NetCDF: In Fortran, string too short";
144      case NC_EMAXNAME:
145  return "NetCDF: NC_MAX_NAME exceeded";
146      case NC_EUNLIMIT:
147  return "NetCDF: NC_UNLIMITED size already in use";
148      case NC_ENORECVARS:
149  return "NetCDF: nc_rec op when there are no record vars";
150      case NC_ECHAR:
151  return "NetCDF: Attempt to convert between text & numbers";
152      case NC_EEDGE:
153  return "NetCDF: Start+count exceeds dimension bound";
154      case NC_ESTRIDE:
155  return "NetCDF: Illegal stride";
156      case NC_EBADNAME:
157  return "NetCDF: Name contains illegal characters";
158      case NC_ERANGE:
159  return "NetCDF: Numeric conversion not representable";
160      case NC_ENOMEM:
161  return "NetCDF: Memory allocation (malloc) failure";
162      case NC_EVARSIZE:
163  return "NetCDF: One or more variable sizes violate format constraints";
164      case NC_EDIMSIZE:
165  return "NetCDF: Invalid dimension size";
166      case NC_ETRUNC:
167  return "NetCDF: File likely truncated or possibly corrupted";
168      case NC_EAXISTYPE:
169  return "NetCDF: Illegal axis type";
170      case NC_EDAP:
171  return "NetCDF: DAP failure";
172      case NC_ECURL:
173  return "NetCDF: libcurl failure";
174      case NC_EIO:
175  return "NetCDF: I/O failure";
176      case NC_ENODATA:
177  return "NetCDF: Variable has no data in DAP request";
178      case NC_EDAPSVC:
179  return "NetCDF: DAP server error";
180      case NC_EDAS:
181  return "NetCDF: Malformed or inaccessible DAP DAS";
182      case NC_EDDS:
183  return "NetCDF: Malformed or inaccessible DAP DDS";
184      case NC_EDATADDS:
185  return "NetCDF: Malformed or inaccessible DAP DATADDS";
186      case NC_EDAPURL:
187  return "NetCDF: Malformed URL";
188      case NC_EDAPCONSTRAINT:
189  return "NetCDF: Malformed or unexpected Constraint";
190      case NC_ETRANSLATION:
191  return "NetCDF: Untranslatable construct";
192      case NC_EACCESS:
193  return "NetCDF: Access failure";
194      case NC_EAUTH:
195  return "NetCDF: Authorization failure";
196      case NC_ENOTFOUND:
197  return "NetCDF: file not found";
198      case NC_ECANTEXTEND:
199 return "NetCDF: Attempt to extend dataset during NC_INDEPENDENT I/O operation. Use nc_var_par_access to set mode NC_COLLECTIVE before extending variable.";
200      case NC_ECANTREMOVE:
201  return "NetCDF: cannot delete file";
202      case NC_EHDFERR:
203  return "NetCDF: HDF error";
204      case NC_ECANTREAD:
205  return "NetCDF: Can't read file";
206      case NC_ECANTWRITE:
207  return "NetCDF: Can't write file";
208      case NC_ECANTCREATE:
209  return "NetCDF: Can't create file";
210      case NC_EFILEMETA:
211  return "NetCDF: Can't add HDF5 file metadata";
212      case NC_EDIMMETA:
213  return "NetCDF: Can't define dimensional metadata";
214      case NC_EATTMETA:
215  return "NetCDF: Can't open HDF5 attribute";
216      case NC_EVARMETA:
217  return "NetCDF: Problem with variable metadata.";
218      case NC_ENOCOMPOUND:
219  return "NetCDF: Can't create HDF5 compound type";
220      case NC_EATTEXISTS:
221  return "NetCDF: Attempt to create attribute that alread exists";
222      case NC_ENOTNC4:
223  return "NetCDF: Attempting netcdf-4 operation on netcdf-3 file";
224      case NC_ESTRICTNC3:
225  return "NetCDF: Attempting netcdf-4 operation on strict nc3 netcdf-4 file";
226      case NC_ENOTNC3:
227  return "NetCDF: Attempting netcdf-3 operation on netcdf-4 file";
228      case NC_ENOPAR:
229  return "NetCDF: Parallel operation on file opened for non-parallel access";
230      case NC_EPARINIT:
231  return "NetCDF: Error initializing for parallel access";
232      case NC_EBADGRPID:
233  return "NetCDF: Bad group ID";
234      case NC_EBADTYPID:
235  return "NetCDF: Bad type ID";
236      case NC_ETYPDEFINED:
237  return "NetCDF: Type has already been defined and may not be edited";
238      case NC_EBADFIELD:
239  return "NetCDF: Bad field ID";
240      case NC_EBADCLASS:
241  return "NetCDF: Bad class";
242      case NC_EMAPTYPE:
243  return "NetCDF: Mapped access for atomic types only";
244      case NC_ELATEFILL:
245  return "NetCDF: Attempt to define fill value when data already exists.";
246      case NC_ELATEDEF:
247  return "NetCDF: Attempt to define var properties, like deflate, after enddef.";
248      case NC_EDIMSCALE:
249  return "NetCDF: Probem with HDF5 dimscales.";
250      case NC_ENOGRP:
251  return "NetCDF: No group found.";
252      case NC_ESTORAGE:
253  return "NetCDF: Cannot specify both contiguous and chunking.";
254      case NC_EBADCHUNK:
255  return "NetCDF: Bad chunk sizes.";
256      case NC_ENOTBUILT:
257  return "NetCDF: Attempt to use feature that was not turned on "
258     "when netCDF was built.";
259      case NC_EDISKLESS:
260  return "NetCDF: Error in using diskless access";
261      default:
262#ifdef USE_PNETCDF
263        /* The behavior of ncmpi_strerror here is to return
264           NULL, not a string.  This causes problems in (at least)
265           the fortran interface. */
266        return (ncmpi_strerror(ncerr1) ?
267                ncmpi_strerror(ncerr1) :
268                "Unknown Error");
269#else
270  return "Unknown Error";
271#endif
272   }
273}
274
275/** \} */


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