/src/gdal/netcdf-c-4.7.4/libdispatch/dcompound.c
Line | Count | Source (jump to first uncovered line) |
1 | | /*! \file |
2 | | Functions for Compound Types |
3 | | |
4 | | Copyright 2018 University Corporation for Atmospheric |
5 | | Research/Unidata. See \ref copyright file for more info. */ |
6 | | |
7 | | #include "ncdispatch.h" |
8 | | |
9 | | /** \name Compound Types |
10 | | Functions to create and learn about compound types. */ |
11 | | /*! \{ */ /* All these functions are part of this named group... */ |
12 | | |
13 | | |
14 | | /** \ingroup user_types |
15 | | |
16 | | Create a compound type. Provide an ncid, a name, and a total size (in |
17 | | bytes) of one element of the completed compound type. |
18 | | |
19 | | After calling this function, fill out the type with repeated calls to |
20 | | nc_insert_compound(). Call nc_insert_compound() once for each field |
21 | | you wish to insert into the compound type. |
22 | | |
23 | | \param ncid \ref ncid |
24 | | \param size The size, in bytes, of the compound type. |
25 | | \param name \ref object_name of the created type. |
26 | | \param typeidp The type ID of the new type is copied here. |
27 | | |
28 | | \returns ::NC_NOERR No error. |
29 | | \returns ::NC_EBADID Bad \ref ncid. |
30 | | \returns ::NC_EBADTYPE Bad type id. |
31 | | \returns ::NC_ENAMEINUSE That name is in use. |
32 | | \returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. |
33 | | \returns ::NC_EBADNAME Name contains illegal characters. |
34 | | \returns ::NC_ESTRICTNC3 Attempting a netCDF-4 operation on a netCDF-3 file. |
35 | | \returns ::NC_ENOTNC4 This file was created with the strict netcdf-3 flag, therefore netcdf-4 operations are not allowed. (see nc_open). |
36 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
37 | | \returns ::NC_EPERM Attempt to write to a read-only file. |
38 | | \returns ::NC_ENOTINDEFINE Not in define mode. |
39 | | |
40 | | \section nc_def_compound_example Example |
41 | | |
42 | | \code |
43 | | struct s1 |
44 | | { |
45 | | int i1; |
46 | | int i2; |
47 | | }; |
48 | | struct s1 data[DIM_LEN], data_in[DIM_LEN]; |
49 | | |
50 | | if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR; |
51 | | if (nc_def_compound(ncid, sizeof(struct s1), SVC_REC, &typeid)) ERR; |
52 | | if (nc_insert_compound(ncid, typeid, BATTLES_WITH_KLINGONS, |
53 | | HOFFSET(struct s1, i1), NC_INT)) ERR; |
54 | | if (nc_insert_compound(ncid, typeid, DATES_WITH_ALIENS, |
55 | | HOFFSET(struct s1, i2), NC_INT)) ERR; |
56 | | if (nc_def_dim(ncid, STARDATE, DIM_LEN, &dimid)) ERR; |
57 | | if (nc_def_var(ncid, SERVICE_RECORD, typeid, 1, dimids, &varid)) ERR; |
58 | | if (nc_put_var(ncid, varid, data)) ERR; |
59 | | if (nc_close(ncid)) ERR; |
60 | | \endcode |
61 | | */ |
62 | | int |
63 | | nc_def_compound(int ncid, size_t size, const char *name, |
64 | | nc_type *typeidp) |
65 | 0 | { |
66 | 0 | NC* ncp; |
67 | 0 | int stat = NC_check_id(ncid,&ncp); |
68 | 0 | if(stat != NC_NOERR) return stat; |
69 | 0 | return ncp->dispatch->def_compound(ncid,size,name,typeidp); |
70 | 0 | } |
71 | | |
72 | | /** \ingroup user_types |
73 | | Insert a named field into a compound type. |
74 | | |
75 | | \param ncid \ref ncid |
76 | | |
77 | | \param xtype The typeid for this compound type, as returned by |
78 | | nc_def_compound(), or nc_inq_var(). |
79 | | |
80 | | \param name The \ref object_name of the new field. |
81 | | |
82 | | \param offset Offset in byte from the beginning of the compound type |
83 | | for this field. |
84 | | |
85 | | \param field_typeid The type of the field to be inserted. |
86 | | |
87 | | \returns ::NC_NOERR No error. |
88 | | \returns ::NC_EBADID Bad \ref ncid. |
89 | | \returns ::NC_EBADTYPE Bad type id. |
90 | | \returns ::NC_ENAMEINUSE That name is in use. |
91 | | \returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. |
92 | | \returns ::NC_EBADNAME Name contains illegal characters. |
93 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
94 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
95 | | \returns ::NC_EPERM Attempt to write to a read-only file. |
96 | | \returns ::NC_ENOTINDEFINE Not in define mode. |
97 | | */ |
98 | | int |
99 | | nc_insert_compound(int ncid, nc_type xtype, const char *name, |
100 | | size_t offset, nc_type field_typeid) |
101 | 0 | { |
102 | 0 | NC *ncp; |
103 | 0 | int stat = NC_check_id(ncid, &ncp); |
104 | 0 | if(stat != NC_NOERR) return stat; |
105 | 0 | return ncp->dispatch->insert_compound(ncid, xtype, name, |
106 | 0 | offset, field_typeid); |
107 | 0 | } |
108 | | |
109 | | /** \ingroup user_types |
110 | | Insert a named array field into a compound type. |
111 | | |
112 | | \param ncid \ref ncid |
113 | | |
114 | | \param xtype The typeid for this compound type, as returned by |
115 | | nc_def_compound(), or nc_inq_var(). |
116 | | |
117 | | \param name The \ref object_name of the new field. |
118 | | |
119 | | \param offset Offset in byte from the beginning of the compound type |
120 | | for this field. |
121 | | |
122 | | \param field_typeid The type of the field to be inserted. |
123 | | |
124 | | \param ndims Number of dimensions in array. |
125 | | |
126 | | \param dim_sizes Array of dimension sizes. |
127 | | |
128 | | \returns ::NC_NOERR No error. |
129 | | \returns ::NC_EBADID Bad \ref ncid. |
130 | | \returns ::NC_EBADTYPE Bad type id. |
131 | | \returns ::NC_ENAMEINUSE That name is in use. |
132 | | \returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. |
133 | | \returns ::NC_EBADNAME Name contains illegal characters. |
134 | | \returns ::NC_ESTRICTNC3 Attempting a netCDF-4 operation on a netCDF-3 file. |
135 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
136 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
137 | | \returns ::NC_EPERM Attempt to write to a read-only file. |
138 | | \returns ::NC_ENOTINDEFINE Not in define mode. |
139 | | */ |
140 | | int |
141 | | nc_insert_array_compound(int ncid, nc_type xtype, const char *name, |
142 | | size_t offset, nc_type field_typeid, |
143 | | int ndims, const int *dim_sizes) |
144 | 0 | { |
145 | 0 | NC* ncp; |
146 | 0 | int stat = NC_check_id(ncid,&ncp); |
147 | 0 | if(stat != NC_NOERR) return stat; |
148 | 0 | return ncp->dispatch->insert_array_compound(ncid,xtype,name,offset,field_typeid,ndims,dim_sizes); |
149 | 0 | } |
150 | | |
151 | | /** \ingroup user_types |
152 | | Learn about a compound type. Get the number of fields, len, and |
153 | | name of a compound type. |
154 | | |
155 | | \param ncid \ref ncid |
156 | | |
157 | | \param xtype The typeid for this compound type, as returned by |
158 | | nc_def_compound(), or nc_inq_var(). |
159 | | |
160 | | \param name Returned \ref object_name of compound type. \ref |
161 | | ignored_if_null. |
162 | | |
163 | | \param sizep Returned size of compound type in bytes. \ref ignored_if_null. |
164 | | |
165 | | \param nfieldsp The number of fields in the compound type will be |
166 | | placed here. \ref ignored_if_null. |
167 | | |
168 | | \returns ::NC_NOERR No error. |
169 | | \returns ::NC_EBADID Bad \ref ncid. |
170 | | \returns ::NC_EBADTYPE Bad type id. |
171 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
172 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
173 | | */ |
174 | | int |
175 | | nc_inq_compound(int ncid, nc_type xtype, char *name, |
176 | | size_t *sizep, size_t *nfieldsp) |
177 | 0 | { |
178 | 0 | int class = 0; |
179 | 0 | int stat = nc_inq_user_type(ncid,xtype,name,sizep,NULL,nfieldsp,&class); |
180 | 0 | if(stat != NC_NOERR) return stat; |
181 | 0 | if(class != NC_COMPOUND) stat = NC_EBADTYPE; |
182 | 0 | return stat; |
183 | 0 | } |
184 | | |
185 | | /** \ingroup user_types |
186 | | Learn the name of a compound type. |
187 | | |
188 | | \param ncid \ref ncid |
189 | | |
190 | | \param xtype The typeid for this compound type, as returned by |
191 | | nc_def_compound(), or nc_inq_var(). |
192 | | |
193 | | \param name Returned \ref object_name of compound type. \ref |
194 | | ignored_if_null. |
195 | | |
196 | | \returns ::NC_NOERR No error. |
197 | | \returns ::NC_EBADID Bad \ref ncid. |
198 | | \returns ::NC_EBADTYPE Bad type id. |
199 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
200 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
201 | | */ |
202 | | int |
203 | | nc_inq_compound_name(int ncid, nc_type xtype, char *name) |
204 | 0 | { |
205 | 0 | return nc_inq_compound(ncid,xtype,name,NULL,NULL); |
206 | 0 | } |
207 | | |
208 | | /** \ingroup user_types |
209 | | Learn the size of a compound type. |
210 | | |
211 | | \param ncid \ref ncid |
212 | | |
213 | | \param xtype The typeid for this compound type, as returned by |
214 | | nc_def_compound(), or nc_inq_var(). |
215 | | |
216 | | \param sizep Returned size of compound type in bytes. \ref |
217 | | ignored_if_null. |
218 | | |
219 | | \returns ::NC_NOERR No error. |
220 | | \returns ::NC_EBADID Bad \ref ncid. |
221 | | \returns ::NC_EBADTYPE Bad type id. |
222 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
223 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
224 | | */ |
225 | | int |
226 | | nc_inq_compound_size(int ncid, nc_type xtype, size_t *sizep) |
227 | 0 | { |
228 | 0 | return nc_inq_compound(ncid,xtype,NULL,sizep,NULL); |
229 | 0 | } |
230 | | |
231 | | /** \ingroup user_types |
232 | | Learn the number of fields in a compound type. |
233 | | |
234 | | \param ncid \ref ncid |
235 | | |
236 | | \param xtype The typeid for this compound type, as returned by |
237 | | nc_def_compound(), or nc_inq_var(). |
238 | | |
239 | | \param nfieldsp The number of fields in the compound type will be |
240 | | placed here. \ref ignored_if_null. |
241 | | |
242 | | \returns ::NC_NOERR No error. |
243 | | \returns ::NC_EBADID Bad \ref ncid. |
244 | | \returns ::NC_EBADTYPE Bad type id. |
245 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
246 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
247 | | */ |
248 | | int |
249 | | nc_inq_compound_nfields(int ncid, nc_type xtype, size_t *nfieldsp) |
250 | 0 | { |
251 | 0 | return nc_inq_compound(ncid,xtype,NULL,NULL,nfieldsp); |
252 | 0 | } |
253 | | |
254 | | /** \ingroup user_types |
255 | | Get information about one of the fields of a compound type. |
256 | | |
257 | | \param ncid \ref ncid |
258 | | |
259 | | \param xtype The typeid for this compound type, as returned by |
260 | | nc_def_compound(), or nc_inq_var(). |
261 | | |
262 | | \param fieldid A zero-based index number specifying a field in the |
263 | | compound type. |
264 | | |
265 | | \param name Returned \ref object_name of the field. \ref |
266 | | ignored_if_null. |
267 | | |
268 | | \param offsetp A pointer which will get the offset of the field. \ref |
269 | | ignored_if_null. |
270 | | |
271 | | \param field_typeidp A pointer which will get the typeid of the |
272 | | field. \ref ignored_if_null. |
273 | | |
274 | | \param ndimsp A pointer which will get the number of dimensions of the |
275 | | field. \ref ignored_if_null. |
276 | | |
277 | | \param dim_sizesp A pointer which will get the dimension sizes of the |
278 | | field. \ref ignored_if_null. |
279 | | |
280 | | \returns ::NC_NOERR No error. |
281 | | \returns ::NC_EBADID Bad \ref ncid. |
282 | | \returns ::NC_EBADTYPE Bad type id. |
283 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
284 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
285 | | */ |
286 | | int |
287 | | nc_inq_compound_field(int ncid, nc_type xtype, int fieldid, |
288 | | char *name, size_t *offsetp, |
289 | | nc_type *field_typeidp, int *ndimsp, |
290 | | int *dim_sizesp) |
291 | 0 | { |
292 | 0 | NC* ncp; |
293 | 0 | int stat = NC_check_id(ncid,&ncp); |
294 | 0 | if(stat != NC_NOERR) return stat; |
295 | 0 | return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, |
296 | 0 | name, offsetp, field_typeidp, |
297 | 0 | ndimsp, dim_sizesp); |
298 | 0 | } |
299 | | |
300 | | /** \ingroup user_types |
301 | | Get information about one of the fields of a compound type. |
302 | | |
303 | | \param ncid \ref ncid |
304 | | |
305 | | \param xtype The typeid for this compound type, as returned by |
306 | | nc_def_compound(), or nc_inq_var(). |
307 | | |
308 | | \param fieldid A zero-based index number specifying a field in the |
309 | | compound type. |
310 | | |
311 | | \param name Returned \ref object_name of the field. \ref |
312 | | ignored_if_null. |
313 | | |
314 | | \returns ::NC_NOERR No error. |
315 | | \returns ::NC_EBADID Bad \ref ncid. |
316 | | \returns ::NC_EBADTYPE Bad type id. |
317 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
318 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
319 | | */ |
320 | | int |
321 | | nc_inq_compound_fieldname(int ncid, nc_type xtype, int fieldid, |
322 | | char *name) |
323 | 0 | { |
324 | 0 | NC* ncp; |
325 | 0 | int stat = NC_check_id(ncid,&ncp); |
326 | 0 | if(stat != NC_NOERR) return stat; |
327 | 0 | return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, |
328 | 0 | name, NULL, NULL, NULL, |
329 | 0 | NULL); |
330 | 0 | } |
331 | | |
332 | | /** \ingroup user_types |
333 | | Get information about one of the fields of a compound type. |
334 | | |
335 | | \param ncid \ref ncid |
336 | | |
337 | | \param xtype The typeid for this compound type, as returned by |
338 | | nc_def_compound(), or nc_inq_var(). |
339 | | |
340 | | \param fieldid A zero-based index number specifying a field in the |
341 | | compound type. |
342 | | |
343 | | \param offsetp A pointer which will get the offset of the field. \ref |
344 | | ignored_if_null. |
345 | | |
346 | | \returns ::NC_NOERR No error. |
347 | | \returns ::NC_EBADID Bad \ref ncid. |
348 | | \returns ::NC_EBADTYPE Bad type id. |
349 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
350 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
351 | | */ |
352 | | int |
353 | | nc_inq_compound_fieldoffset(int ncid, nc_type xtype, int fieldid, |
354 | | size_t *offsetp) |
355 | 0 | { |
356 | 0 | NC* ncp; |
357 | 0 | int stat = NC_check_id(ncid,&ncp); |
358 | 0 | if(stat != NC_NOERR) return stat; |
359 | 0 | return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,offsetp,NULL,NULL,NULL); |
360 | 0 | } |
361 | | |
362 | | /** \ingroup user_types |
363 | | Get information about one of the fields of a compound type. |
364 | | |
365 | | \param ncid \ref ncid |
366 | | |
367 | | \param xtype The typeid for this compound type, as returned by |
368 | | nc_def_compound(), or nc_inq_var(). |
369 | | |
370 | | \param fieldid A zero-based index number specifying a field in the |
371 | | compound type. |
372 | | |
373 | | \param field_typeidp A pointer which will get the typeid of the |
374 | | field. \ref ignored_if_null. |
375 | | |
376 | | \returns ::NC_NOERR No error. |
377 | | \returns ::NC_EBADID Bad \ref ncid. |
378 | | \returns ::NC_EBADTYPE Bad type id. |
379 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
380 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
381 | | */ |
382 | | int |
383 | | nc_inq_compound_fieldtype(int ncid, nc_type xtype, int fieldid, |
384 | | nc_type *field_typeidp) |
385 | 0 | { |
386 | 0 | NC* ncp; |
387 | 0 | int stat = NC_check_id(ncid,&ncp); |
388 | 0 | if(stat != NC_NOERR) return stat; |
389 | 0 | return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,NULL,field_typeidp,NULL,NULL); |
390 | 0 | } |
391 | | |
392 | | /** \ingroup user_types |
393 | | Get information about one of the fields of a compound type. |
394 | | |
395 | | \param ncid \ref ncid |
396 | | |
397 | | \param xtype The typeid for this compound type, as returned by |
398 | | nc_def_compound(), or nc_inq_var(). |
399 | | |
400 | | \param fieldid A zero-based index number specifying a field in the |
401 | | compound type. |
402 | | |
403 | | \param ndimsp A pointer which will get the number of dimensions of the |
404 | | field. \ref ignored_if_null. |
405 | | |
406 | | \returns ::NC_NOERR No error. |
407 | | \returns ::NC_EBADID Bad \ref ncid. |
408 | | \returns ::NC_EBADTYPE Bad type id. |
409 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
410 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
411 | | */ |
412 | | int |
413 | | nc_inq_compound_fieldndims(int ncid, nc_type xtype, int fieldid, |
414 | | int *ndimsp) |
415 | 0 | { |
416 | 0 | NC* ncp; |
417 | 0 | int stat = NC_check_id(ncid,&ncp); |
418 | 0 | if(stat != NC_NOERR) return stat; |
419 | 0 | return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,NULL,NULL,ndimsp,NULL); |
420 | 0 | } |
421 | | |
422 | | /** \ingroup user_types |
423 | | Get information about one of the fields of a compound type. |
424 | | |
425 | | \param ncid \ref ncid |
426 | | |
427 | | \param xtype The typeid for this compound type, as returned by |
428 | | nc_def_compound(), or nc_inq_var(). |
429 | | |
430 | | \param fieldid A zero-based index number specifying a field in the |
431 | | compound type. |
432 | | |
433 | | \param dim_sizesp A pointer which will get the dimension sizes of the |
434 | | field. \ref ignored_if_null. |
435 | | |
436 | | \returns ::NC_NOERR No error. |
437 | | \returns ::NC_EBADID Bad \ref ncid. |
438 | | \returns ::NC_EBADTYPE Bad type id. |
439 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
440 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
441 | | */ |
442 | | int |
443 | | nc_inq_compound_fielddim_sizes(int ncid, nc_type xtype, int fieldid, |
444 | | int *dim_sizesp) |
445 | 0 | { |
446 | 0 | NC *ncp; |
447 | 0 | int stat = NC_check_id(ncid, &ncp); |
448 | 0 | if(stat != NC_NOERR) return stat; |
449 | 0 | return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, |
450 | 0 | NULL, NULL, NULL, NULL, |
451 | 0 | dim_sizesp); |
452 | 0 | } |
453 | | |
454 | | /** \ingroup user_types |
455 | | Learn the Index of a Named Field in a Compound Type. Get the index |
456 | | * of a field in a compound type from the name. |
457 | | |
458 | | \param ncid \ref ncid |
459 | | |
460 | | \param xtype The typeid for this compound type, as returned by |
461 | | nc_def_compound(), or nc_inq_var(). |
462 | | |
463 | | \param name \ref object_name of the field. \ref ignored_if_null. |
464 | | |
465 | | \param fieldidp A pointer which will get the index of the named |
466 | | field. \ref ignored_if_null. |
467 | | |
468 | | \returns ::NC_NOERR No error. |
469 | | \returns ::NC_EBADID Bad \ref ncid. |
470 | | \returns ::NC_EBADTYPE Bad type id. |
471 | | \returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. |
472 | | \returns ::NC_EHDFERR An error was reported by the HDF5 layer. |
473 | | */ |
474 | | int |
475 | | nc_inq_compound_fieldindex(int ncid, nc_type xtype, const char *name, |
476 | | int *fieldidp) |
477 | 0 | { |
478 | 0 | NC* ncp; |
479 | 0 | int stat = NC_check_id(ncid,&ncp); |
480 | 0 | if(stat != NC_NOERR) return stat; |
481 | 0 | return ncp->dispatch->inq_compound_fieldindex(ncid,xtype,name,fieldidp); |
482 | 0 | } |
483 | | /*! \} */ /* End of named group ...*/ |