Coverage Report

Created: 2025-06-09 07:42

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