1 /*
2  *	Copyright 1996, University Corporation for Atmospheric Research
3  *	See netcdf/COPYRIGHT file for copying and redistribution conditions.
4  */
5 
6 #ifndef _NCX_H_
7 #define _NCX_H_
8 
9 #include "ncdispatch.h"
10 #include "ncio.h"
11 #include "fbits.h"
12 
13 #ifndef HAVE_STDINT_H
14 #include "pstdint.h"
15 #else
16 #include <stdint.h>
17 #endif /* HAVE_STDINT_H */
18 
19 /*
20  * An external data representation interface.
21 
22  *
23  * This started out as a general replacement for ONC XDR,
24  * specifically, the xdrmem family of functions.
25  *
26  * We eventually realized that we could write more portable
27  * code if we decoupled any association between the 'C' types
28  * and the external types. (XDR has this association between the 'C'
29  * types and the external representations, like xdr_int() takes
30  * an int argument and goes to an external int representation.)
31  * So, now there is a matrix of functions.
32  *
33  */
34 
35 #include "config.h" /* output of 'configure' */
36 #include "rnd.h"
37 #include <stddef.h> /* size_t */
38 #include <errno.h>
39 #include <sys/types.h> /* off_t */
40 #include "ncdispatch.h"
41 
42 #if defined(_CRAY) && !defined(_CRAYIEEE) && !defined(__crayx1)
43 #define CRAYFLOAT 1 /* CRAY Floating point */
44 #elif defined(_SX) && defined(_FLOAT2)	/* NEC SUPER-UX in CRAY mode */
45 #define CRAYFLOAT 1 /* CRAY Floating point */
46 #endif
47 
48 #ifndef __cplusplus
49   #if __STDC_VERSION__ == 199901L /* C99 */
50   /* "inline" is a keyword */
51   #elif _MSC_VER >= 1500 /* MSVC 9 or newer */
52     #define inline __inline
53   #elif __GNUC__ >= 3 /* GCC 3 or newer */
54     #define inline __inline
55   #else /* Unknown or ancient */
56     #define inline
57   #endif
58 #endif
59 
60 /*
61  * External sizes of the primitive elements.
62  */
63 #define X_SIZEOF_CHAR		1
64 #define X_SIZEOF_SHORT		2
65 #define X_SIZEOF_INT		4	/* xdr_int */
66 #if 0
67 #define X_SIZEOF_LONG		8 */	/* alias */
68 #endif
69 #define X_SIZEOF_FLOAT		4
70 #define X_SIZEOF_DOUBLE		8
71 
72 /* additional data types in CDF-5 */
73 #define X_SIZEOF_UBYTE		1
74 #define X_SIZEOF_USHORT		2
75 #define X_SIZEOF_UINT		4
76 #define X_SIZEOF_LONGLONG	8
77 #define X_SIZEOF_ULONGLONG	8
78 #define X_SIZEOF_INT64		8
79 #define X_SIZEOF_UINT64		8
80 
81 /*
82  * For now, netcdf is limited to 32 bit sizes,
83  * If compiled with support for "large files", then
84  * netcdf will use a 64 bit off_t and it can then write a file
85  * using 64 bit offsets.
86  *  see also X_SIZE_MAX, X_OFF_MAX below
87  */
88 #define X_SIZEOF_OFF_T		(sizeof(off_t))
89 #define X_SIZEOF_SIZE_T		X_SIZEOF_INT
90 
91 /*
92  * limits of the external representation
93  */
94 #define X_SCHAR_MIN	(-128)
95 #define X_SCHAR_MAX	127
96 #define X_UCHAR_MAX	255U
97 #define X_SHORT_MIN	(-32768)
98 #define X_SHRT_MIN	X_SHORT_MIN	/* alias compatible with limits.h */
99 #define X_SHORT_MAX	32767
100 #define X_SHRT_MAX	X_SHORT_MAX	/* alias compatible with limits.h */
101 #define X_USHORT_MAX	65535U
102 #define X_USHRT_MAX	X_USHORT_MAX	/* alias compatible with limits.h */
103 #define X_INT_MIN	(-2147483647-1)
104 #define X_INT_MAX	2147483647
105 #define X_UINT_MAX	4294967295U
106 #define X_INT64_MIN	(-9223372036854775807LL-1LL)
107 #define X_INT64_MAX	9223372036854775807LL
108 #define X_UINT64_MAX	18446744073709551615ULL
109 #define X_FLOAT_MAX	3.402823466e+38f
110 #define X_FLOAT_MIN	(-X_FLOAT_MAX)
111 #define X_FLT_MAX	X_FLOAT_MAX	/* alias compatible with limits.h */
112 #if CRAYFLOAT
113 /* ldexp(1. - ldexp(.5 , -46), 1024) */
114 #define X_DOUBLE_MAX    1.79769313486230e+308
115 #else
116 /* scalb(1. - scalb(.5 , -52), 1024) */
117 #define X_DOUBLE_MAX	1.7976931348623157e+308
118 #endif
119 #define X_DOUBLE_MIN	(-X_DOUBLE_MAX)
120 #define X_DBL_MAX	X_DOUBLE_MAX	/* alias compatible with limits.h */
121 
122 #define X_SIZE_MAX	X_UINT_MAX
123 #define X_OFF_MAX	X_INT_MAX
124 
125 
126 /* Begin ncx_len */
127 
128 /*
129  * ncx_len_xxx() interfaces are defined as macros below,
130  * These give the length of an array of nelems of the type.
131  * N.B. The 'char' and 'short' interfaces give the X_ALIGNED length.
132  */
133 #define X_ALIGN			4	/* a.k.a. BYTES_PER_XDR_UNIT */
134 
135 #define ncx_len_char(nelems) \
136 	_RNDUP((nelems), X_ALIGN)
137 
138 #define ncx_len_short(nelems) \
139 	(((nelems) + (nelems)%2)  * X_SIZEOF_SHORT)
140 
141 #define ncx_len_int(nelems) \
142 	((nelems) * X_SIZEOF_INT)
143 
144 #define ncx_len_long(nelems) \
145 	((nelems) * X_SIZEOF_LONG)
146 
147 #define ncx_len_float(nelems) \
148 	((nelems) * X_SIZEOF_FLOAT)
149 
150 #define ncx_len_double(nelems) \
151 	((nelems) * X_SIZEOF_DOUBLE)
152 
153 #define ncx_len_ubyte(nelems) \
154 	_RNDUP((nelems), X_ALIGN)
155 
156 #define ncx_len_ushort(nelems) \
157 	(((nelems) + (nelems)%2)  * X_SIZEOF_USHORT)
158 
159 #define ncx_len_uint(nelems) \
160 	((nelems) * X_SIZEOF_UINT)
161 
162 #define ncx_len_int64(nelems) \
163 	((nelems) * X_SIZEOF_INT64)
164 
165 #define ncx_len_uint64(nelems) \
166 	((nelems) * X_SIZEOF_UINT64)
167 
168 /* End ncx_len */
169 
170 #ifndef HAVE_SCHAR
171 typedef signed char schar;
172 #endif
173 
174 /*
175  * Primitive numeric conversion functions.
176  * The `put' functions convert from native internal
177  * type to the external type, while the `get' functions
178  * convert from the external to the internal.
179  *
180  * These take the form
181  *	int ncx_get_{external_type}_{internal_type}(
182  *		const void *xp,
183  *		internal_type *ip
184  *	);
185  *	int ncx_put_{external_type}_{internal_type}(
186  *		void *xp,
187  *		const internal_type *ip
188  *	);
189  * where
190  *	`external_type' and `internal_type' chosen from
191  *		schar
192  *		uchar
193  *		short
194  *		ushort
195  *		int
196  *		uint
197  *		float
198  *		double
199  *		longlong == int64
200  *	        ulonglong == uint64
201  *
202  * Not all combinations make sense.
203  * We may not implement all combinations that make sense.
204  * The netcdf functions that use this ncx interface don't
205  * use these primitive conversion functions. They use the
206  * aggregate conversion functions declared below.
207  *
208  * Storage for a single element of external type is at the `void * xp'
209  * argument.
210  *
211  * Storage for a single element of internal type is at `ip' argument.
212  *
213  * These functions return 0 (NC_NOERR) when no error occurred,
214  * or NC_ERANGE when the value being converted is too large.
215  * When NC_ERANGE occurs, an undefined (implementation dependent)
216  * conversion may have occurred.
217  *
218  * Note that loss of precision may occur silently.
219  *
220  */
221 
222 #if 0
223 extern int
224 ncx_get_schar_schar(const void *xp, schar *ip);
225 extern int
226 ncx_get_schar_uchar(const void *xp, uchar *ip);
227 extern int
228 ncx_get_schar_short(const void *xp, short *ip);
229 extern int
230 ncx_get_schar_int(const void *xp, int *ip);
231 extern int
232 ncx_get_schar_long(const void *xp, long *ip);
233 extern int
234 ncx_get_schar_float(const void *xp, float *ip);
235 extern int
236 ncx_get_schar_double(const void *xp, double *ip);
237 
238 extern int
239 ncx_put_schar_schar(void *xp, const schar *ip, void *fillp);
240 extern int
241 ncx_put_schar_uchar(void *xp, const uchar *ip, void *fillp);
242 extern int
243 ncx_put_schar_short(void *xp, const short *ip, void *fillp);
244 extern int
245 ncx_put_schar_int(void *xp, const int *ip, void *fillp);
246 extern int
247 ncx_put_schar_long(void *xp, const long *ip, void *fillp);
248 extern int
249 ncx_put_schar_float(void *xp, const float *ip, void *fillp);
250 extern int
251 ncx_put_schar_double(void *xp, const double *ip, void *fillp);
252 #endif
253 
254 /*
255  * Other primitive conversion functions
256  * N.B. slightly different interface
257  * Used by netcdf.
258  */
259 
260 /* ncx_get_int_size_t */
261 extern int
262 ncx_get_size_t(const void **xpp, size_t *ulp);
263 /* ncx_get_int_off_t */
264 extern int
265 ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t);
266 
267 /* ncx_put_int_size_t */
268 extern int
269 ncx_put_size_t(void **xpp, const size_t *ulp);
270 /* ncx_put_int_off_t */
271 extern int
272 ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t);
273 
274 extern int
275 ncx_get_int32(const void **xpp, int *ip);
276 extern int
277 ncx_get_int64(const void **xpp, long long *ip);
278 extern int
279 ncx_put_int32(void **xpp, const int ip);
280 extern int
281 ncx_put_int64(void **xpp, const long long ip);
282 
283 extern int
284 ncx_get_uint32(const void **xpp, unsigned int *ip);
285 extern int
286 ncx_get_uint64(const void **xpp, unsigned long long *ip);
287 extern int
288 ncx_put_uint32(void **xpp, const unsigned int ip);
289 extern int
290 ncx_put_uint64(void **xpp, const unsigned long long ip);
291 
292 extern int ncx_get_int_int(const void *xp, int *ip);
293 extern int ncx_put_int_int(void *xp, const int *ip, void *fillp);
294 
295 /*
296  * Aggregate numeric conversion functions.
297  * Convert an array.  Replaces xdr_array(...).
298  * These functions are used by netcdf. Unlike the xdr
299  * interface, we optimize for aggregate conversions.
300  * This functions should be implemented to take advantage
301  * of multiple processor / parallel hardware where available.
302  *
303  * These take the form
304  *	int ncx_getn_{external_type}_{internal_type}(
305  *		const void *xpp,
306  *		size_t nelems,
307  *		internal_type *ip
308  *	);
309  *	int ncx_putn_{external_type}_{internal_type}(
310  *		void **xpp,
311  *		size_t nelems,
312  *		const internal_type *ip
313  *	);
314  * Where the types are as in the primitive numeric conversion functions.
315  *
316  * The value of the pointer to pointer argument, *xpp, is
317  * expected to reference storage for `nelems' of the external
318  * type.  On return, it modified to reference just past the last
319  * converted external element.
320  *
321  * The types whose external size is less than X_ALIGN also have `pad'
322  * interfaces. These round (and zero fill on put) *xpp up to X_ALIGN
323  * boundaries. (This is the usual xdr behavior.)
324  *
325  * The `ip' argument should point to an array of `nelems' of
326  * internal_type.
327  *
328  * Range errors (NC_ERANGE) for a individual values in the array
329  * DO NOT terminate the array conversion. All elements are converted,
330  * with some having undefined values.
331  * If any range error occurs, the function returns NC_ERANGE.
332  *
333  */
334 
335 /*---- schar ----------------------------------------------------------------*/
336 extern int
337 ncx_getn_schar_schar (const void **xpp, size_t nelems, schar  *ip);
338 extern int
339 ncx_getn_schar_uchar (const void **xpp, size_t nelems, uchar  *ip);
340 extern int
341 ncx_getn_schar_short (const void **xpp, size_t nelems, short  *ip);
342 extern int
343 ncx_getn_schar_ushort(const void **xpp, size_t nelems, ushort *ip);
344 extern int
345 ncx_getn_schar_int   (const void **xpp, size_t nelems, int    *ip);
346 extern int
347 ncx_getn_schar_uint  (const void **xpp, size_t nelems, uint   *ip);
348 extern int
349 ncx_getn_schar_long  (const void **xpp, size_t nelems, long   *ip);
350 extern int
351 ncx_getn_schar_float (const void **xpp, size_t nelems, float  *ip);
352 extern int
353 ncx_getn_schar_double(const void **xpp, size_t nelems, double *ip);
354 extern int
355 ncx_getn_schar_longlong (const void **xpp, size_t nelems, longlong  *ip);
356 extern int
357 ncx_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
358 
359 extern int
360 ncx_pad_getn_schar_schar (const void **xpp, size_t nelems, schar  *ip);
361 extern int
362 ncx_pad_getn_schar_uchar (const void **xpp, size_t nelems, uchar  *ip);
363 extern int
364 ncx_pad_getn_schar_short (const void **xpp, size_t nelems, short  *ip);
365 extern int
366 ncx_pad_getn_schar_ushort(const void **xpp, size_t nelems, ushort *ip);
367 extern int
368 ncx_pad_getn_schar_int   (const void **xpp, size_t nelems, int    *ip);
369 extern int
370 ncx_pad_getn_schar_uint  (const void **xpp, size_t nelems, uint   *ip);
371 extern int
372 ncx_pad_getn_schar_long  (const void **xpp, size_t nelems, long   *ip);
373 extern int
374 ncx_pad_getn_schar_float (const void **xpp, size_t nelems, float  *ip);
375 extern int
376 ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *ip);
377 extern int
378 ncx_pad_getn_schar_longlong (const void **xpp, size_t nelems, longlong  *ip);
379 extern int
380 ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
381 
382 extern int
383 ncx_putn_schar_schar (void **xpp, size_t nelems, const schar   *ip, void *fillp);
384 extern int
385 ncx_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
386 extern int
387 ncx_putn_schar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
388 extern int
389 ncx_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
390 extern int
391 ncx_putn_schar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
392 extern int
393 ncx_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
394 extern int
395 ncx_putn_schar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
396 extern int
397 ncx_putn_schar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
398 extern int
399 ncx_putn_schar_double(void **xpp, size_t nelems, const double  *ip, void *fillp);
400 extern int
401 ncx_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
402 extern int
403 ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
404 
405 extern int
406 ncx_pad_putn_schar_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
407 extern int
408 ncx_pad_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
409 extern int
410 ncx_pad_putn_schar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
411 extern int
412 ncx_pad_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
413 extern int
414 ncx_pad_putn_schar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
415 extern int
416 ncx_pad_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
417 extern int
418 ncx_pad_putn_schar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
419 extern int
420 ncx_pad_putn_schar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
421 extern int
422 ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *ip, void *fillp);
423 extern int
424 ncx_pad_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
425 extern int
426 ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
427 
428 /*---- uchar ----------------------------------------------------------------*/
429 extern int
430 ncx_getn_uchar_schar (const void **xpp, size_t nelems, schar  *ip);
431 extern int
432 ncx_getn_uchar_uchar (const void **xpp, size_t nelems, uchar  *ip);
433 extern int
434 ncx_getn_uchar_short (const void **xpp, size_t nelems, short  *ip);
435 extern int
436 ncx_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *ip);
437 extern int
438 ncx_getn_uchar_int   (const void **xpp, size_t nelems, int    *ip);
439 extern int
440 ncx_getn_uchar_uint  (const void **xpp, size_t nelems, uint   *ip);
441 extern int
442 ncx_getn_uchar_long  (const void **xpp, size_t nelems, long   *ip);
443 extern int
444 ncx_getn_uchar_float (const void **xpp, size_t nelems, float  *ip);
445 extern int
446 ncx_getn_uchar_double(const void **xpp, size_t nelems, double *ip);
447 extern int
448 ncx_getn_uchar_longlong (const void **xpp, size_t nelems, longlong  *ip);
449 extern int
450 ncx_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
451 
452 extern int
453 ncx_pad_getn_uchar_schar (const void **xpp, size_t nelems, schar  *ip);
454 extern int
455 ncx_pad_getn_uchar_uchar (const void **xpp, size_t nelems, uchar  *ip);
456 extern int
457 ncx_pad_getn_uchar_short (const void **xpp, size_t nelems, short  *ip);
458 extern int
459 ncx_pad_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *ip);
460 extern int
461 ncx_pad_getn_uchar_int   (const void **xpp, size_t nelems, int    *ip);
462 extern int
463 ncx_pad_getn_uchar_uint  (const void **xpp, size_t nelems, uint   *ip);
464 extern int
465 ncx_pad_getn_uchar_long  (const void **xpp, size_t nelems, long   *ip);
466 extern int
467 ncx_pad_getn_uchar_float (const void **xpp, size_t nelems, float  *ip);
468 extern int
469 ncx_pad_getn_uchar_double(const void **xpp, size_t nelems, double *ip);
470 extern int
471 ncx_pad_getn_uchar_longlong (const void **xpp, size_t nelems, longlong  *ip);
472 extern int
473 ncx_pad_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
474 
475 extern int
476 ncx_putn_uchar_schar (void **xpp, size_t nelems, const schar   *ip, void *fillp);
477 extern int
478 ncx_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
479 extern int
480 ncx_putn_uchar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
481 extern int
482 ncx_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
483 extern int
484 ncx_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
485 extern int
486 ncx_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
487 extern int
488 ncx_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
489 extern int
490 ncx_putn_uchar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
491 extern int
492 ncx_putn_uchar_double(void **xpp, size_t nelems, const double  *ip, void *fillp);
493 extern int
494 ncx_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
495 extern int
496 ncx_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
497 
498 extern int
499 ncx_pad_putn_uchar_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
500 extern int
501 ncx_pad_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
502 extern int
503 ncx_pad_putn_uchar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
504 extern int
505 ncx_pad_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
506 extern int
507 ncx_pad_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
508 extern int
509 ncx_pad_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
510 extern int
511 ncx_pad_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
512 extern int
513 ncx_pad_putn_uchar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
514 extern int
515 ncx_pad_putn_uchar_double(void **xpp, size_t nelems, const double *ip, void *fillp);
516 extern int
517 ncx_pad_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
518 extern int
519 ncx_pad_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
520 
521 /*---- short ----------------------------------------------------------------*/
522 extern int
523 ncx_getn_short_schar (const void **xpp, size_t nelems, schar  *ip);
524 extern int
525 ncx_getn_short_uchar (const void **xpp, size_t nelems, uchar  *ip);
526 extern int
527 ncx_getn_short_short (const void **xpp, size_t nelems, short  *ip);
528 extern int
529 ncx_getn_short_ushort(const void **xpp, size_t nelems, ushort *ip);
530 extern int
531 ncx_getn_short_int   (const void **xpp, size_t nelems, int    *ip);
532 extern int
533 ncx_getn_short_uint  (const void **xpp, size_t nelems, uint   *ip);
534 extern int
535 ncx_getn_short_long  (const void **xpp, size_t nelems, long   *ip);
536 extern int
537 ncx_getn_short_float (const void **xpp, size_t nelems, float  *ip);
538 extern int
539 ncx_getn_short_double(const void **xpp, size_t nelems, double *ip);
540 extern int
541 ncx_getn_short_longlong (const void **xpp, size_t nelems, longlong  *ip);
542 extern int
543 ncx_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
544 
545 extern int
546 ncx_pad_getn_short_schar (const void **xpp, size_t nelems, schar  *ip);
547 extern int
548 ncx_pad_getn_short_uchar (const void **xpp, size_t nelems, uchar  *ip);
549 extern int
550 ncx_pad_getn_short_short (const void **xpp, size_t nelems, short  *ip);
551 extern int
552 ncx_pad_getn_short_ushort(const void **xpp, size_t nelems, ushort *ip);
553 extern int
554 ncx_pad_getn_short_int   (const void **xpp, size_t nelems, int    *ip);
555 extern int
556 ncx_pad_getn_short_uint  (const void **xpp, size_t nelems, uint   *ip);
557 extern int
558 ncx_pad_getn_short_long  (const void **xpp, size_t nelems, long   *ip);
559 extern int
560 ncx_pad_getn_short_float (const void **xpp, size_t nelems, float  *ip);
561 extern int
562 ncx_pad_getn_short_double(const void **xpp, size_t nelems, double *ip);
563 extern int
564 ncx_pad_getn_short_longlong (const void **xpp, size_t nelems, longlong  *ip);
565 extern int
566 ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
567 
568 extern int
569 ncx_putn_short_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
570 extern int
571 ncx_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
572 extern int
573 ncx_putn_short_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
574 extern int
575 ncx_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
576 extern int
577 ncx_putn_short_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
578 extern int
579 ncx_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
580 extern int
581 ncx_putn_short_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
582 extern int
583 ncx_putn_short_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
584 extern int
585 ncx_putn_short_double(void **xpp, size_t nelems, const double *ip, void *fillp);
586 extern int
587 ncx_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
588 extern int
589 ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
590 
591 extern int
592 ncx_pad_putn_short_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
593 extern int
594 ncx_pad_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
595 extern int
596 ncx_pad_putn_short_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
597 extern int
598 ncx_pad_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
599 extern int
600 ncx_pad_putn_short_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
601 extern int
602 ncx_pad_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
603 extern int
604 ncx_pad_putn_short_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
605 extern int
606 ncx_pad_putn_short_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
607 extern int
608 ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *ip, void *fillp);
609 extern int
610 ncx_pad_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
611 extern int
612 ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
613 
614 /*---- ushort ---------------------------------------------------------------*/
615 extern int
616 ncx_getn_ushort_schar (const void **xpp, size_t nelems, schar  *ip);
617 extern int
618 ncx_getn_ushort_uchar (const void **xpp, size_t nelems, uchar  *ip);
619 extern int
620 ncx_getn_ushort_short (const void **xpp, size_t nelems, short  *ip);
621 extern int
622 ncx_getn_ushort_ushort(const void **xpp, size_t nelems, ushort *ip);
623 extern int
624 ncx_getn_ushort_int   (const void **xpp, size_t nelems, int    *ip);
625 extern int
626 ncx_getn_ushort_uint  (const void **xpp, size_t nelems, uint   *ip);
627 extern int
628 ncx_getn_ushort_long  (const void **xpp, size_t nelems, long   *ip);
629 extern int
630 ncx_getn_ushort_float (const void **xpp, size_t nelems, float  *ip);
631 extern int
632 ncx_getn_ushort_double(const void **xpp, size_t nelems, double *ip);
633 extern int
634 ncx_getn_ushort_longlong (const void **xpp, size_t nelems, longlong  *ip);
635 extern int
636 ncx_getn_ushort_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
637 
638 extern int
639 ncx_pad_getn_ushort_schar (const void **xpp, size_t nelems, schar  *ip);
640 extern int
641 ncx_pad_getn_ushort_uchar (const void **xpp, size_t nelems, uchar  *ip);
642 extern int
643 ncx_pad_getn_ushort_short (const void **xpp, size_t nelems, short  *ip);
644 extern int
645 ncx_pad_getn_ushort_ushort(const void **xpp, size_t nelems, ushort *ip);
646 extern int
647 ncx_pad_getn_ushort_int   (const void **xpp, size_t nelems, int    *ip);
648 extern int
649 ncx_pad_getn_ushort_uint  (const void **xpp, size_t nelems, uint   *ip);
650 extern int
651 ncx_pad_getn_ushort_long  (const void **xpp, size_t nelems, long   *ip);
652 extern int
653 ncx_pad_getn_ushort_float (const void **xpp, size_t nelems, float  *ip);
654 extern int
655 ncx_pad_getn_ushort_double(const void **xpp, size_t nelems, double *ip);
656 extern int
657 ncx_pad_getn_ushort_longlong (const void **xpp, size_t nelems, longlong  *ip);
658 extern int
659 ncx_pad_getn_ushort_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
660 
661 extern int
662 ncx_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
663 extern int
664 ncx_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
665 extern int
666 ncx_putn_ushort_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
667 extern int
668 ncx_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
669 extern int
670 ncx_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
671 extern int
672 ncx_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
673 extern int
674 ncx_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
675 extern int
676 ncx_putn_ushort_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
677 extern int
678 ncx_putn_ushort_double(void **xpp, size_t nelems, const double *ip, void *fillp);
679 extern int
680 ncx_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
681 extern int
682 ncx_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
683 
684 extern int
685 ncx_pad_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
686 extern int
687 ncx_pad_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
688 extern int
689 ncx_pad_putn_ushort_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
690 extern int
691 ncx_pad_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
692 extern int
693 ncx_pad_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
694 extern int
695 ncx_pad_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
696 extern int
697 ncx_pad_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
698 extern int
699 ncx_pad_putn_ushort_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
700 extern int
701 ncx_pad_putn_ushort_double(void **xpp, size_t nelems, const double *ip, void *fillp);
702 extern int
703 ncx_pad_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
704 extern int
705 ncx_pad_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
706 
707 /*---- int ------------------------------------------------------------------*/
708 extern int
709 ncx_getn_int_schar (const void **xpp, size_t nelems, schar  *ip);
710 extern int
711 ncx_getn_int_uchar (const void **xpp, size_t nelems, uchar  *ip);
712 extern int
713 ncx_getn_int_short (const void **xpp, size_t nelems, short  *ip);
714 extern int
715 ncx_getn_int_ushort(const void **xpp, size_t nelems, ushort *ip);
716 extern int
717 ncx_getn_int_int   (const void **xpp, size_t nelems, int    *ip);
718 extern int
719 ncx_getn_int_uint  (const void **xpp, size_t nelems, uint   *ip);
720 extern int
721 ncx_getn_int_long  (const void **xpp, size_t nelems, long   *ip);
722 extern int
723 ncx_getn_long_long (const void **xpp, size_t nelems, long   *ip);
724 extern int
725 ncx_getn_int_float (const void **xpp, size_t nelems, float  *ip);
726 extern int
727 ncx_getn_int_double(const void **xpp, size_t nelems, double *ip);
728 extern int
729 ncx_getn_int_longlong (const void **xpp, size_t nelems, longlong  *ip);
730 extern int
731 ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
732 
733 extern int
734 ncx_putn_int_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
735 extern int
736 ncx_putn_int_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
737 extern int
738 ncx_putn_int_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
739 extern int
740 ncx_putn_int_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
741 extern int
742 ncx_putn_int_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
743 extern int
744 ncx_putn_int_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
745 extern int
746 ncx_putn_int_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
747 extern int
748 ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip, void *fillp);
749 extern int
750 ncx_putn_int_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
751 extern int
752 ncx_putn_int_double(void **xpp, size_t nelems, const double *ip, void *fillp);
753 extern int
754 ncx_putn_int_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
755 extern int
756 ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
757 
758 /*---- uint -----------------------------------------------------------------*/
759 extern int
760 ncx_getn_uint_schar (const void **xpp, size_t nelems, schar  *ip);
761 extern int
762 ncx_getn_uint_uchar (const void **xpp, size_t nelems, uchar  *ip);
763 extern int
764 ncx_getn_uint_short (const void **xpp, size_t nelems, short  *ip);
765 extern int
766 ncx_getn_uint_ushort(const void **xpp, size_t nelems, ushort *ip);
767 extern int
768 ncx_getn_uint_int   (const void **xpp, size_t nelems, int    *ip);
769 extern int
770 ncx_getn_uint_uint  (const void **xpp, size_t nelems, uint   *ip);
771 extern int
772 ncx_getn_uint_long  (const void **xpp, size_t nelems, long   *ip);
773 extern int
774 ncx_getn_long_long (const void **xpp, size_t nelems, long   *ip);
775 extern int
776 ncx_getn_uint_float (const void **xpp, size_t nelems, float  *ip);
777 extern int
778 ncx_getn_uint_double(const void **xpp, size_t nelems, double *ip);
779 extern int
780 ncx_getn_uint_longlong (const void **xpp, size_t nelems, longlong  *ip);
781 extern int
782 ncx_getn_uint_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
783 
784 extern int
785 ncx_putn_uint_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
786 extern int
787 ncx_putn_uint_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
788 extern int
789 ncx_putn_uint_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
790 extern int
791 ncx_putn_uint_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
792 extern int
793 ncx_putn_uint_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
794 extern int
795 ncx_putn_uint_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
796 extern int
797 ncx_putn_uint_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
798 extern int
799 ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip, void *fillp);
800 extern int
801 ncx_putn_uint_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
802 extern int
803 ncx_putn_uint_double(void **xpp, size_t nelems, const double *ip, void *fillp);
804 extern int
805 ncx_putn_uint_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
806 extern int
807 ncx_putn_uint_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
808 
809 /*---- float ----------------------------------------------------------------*/
810 extern int
811 ncx_getn_float_schar (const void **xpp, size_t nelems, schar  *ip);
812 extern int
813 ncx_getn_float_uchar (const void **xpp, size_t nelems, uchar  *ip);
814 extern int
815 ncx_getn_float_short (const void **xpp, size_t nelems, short  *ip);
816 extern int
817 ncx_getn_float_ushort(const void **xpp, size_t nelems, ushort *ip);
818 extern int
819 ncx_getn_float_int   (const void **xpp, size_t nelems, int    *ip);
820 extern int
821 ncx_getn_float_uint  (const void **xpp, size_t nelems, uint   *ip);
822 extern int
823 ncx_getn_float_long  (const void **xpp, size_t nelems, long   *ip);
824 extern int
825 ncx_getn_float_float (const void **xpp, size_t nelems, float  *ip);
826 extern int
827 ncx_getn_float_double(const void **xpp, size_t nelems, double *ip);
828 extern int
829 ncx_getn_float_longlong (const void **xpp, size_t nelems, longlong  *ip);
830 extern int
831 ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
832 
833 extern int
834 ncx_putn_float_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
835 extern int
836 ncx_putn_float_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
837 extern int
838 ncx_putn_float_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
839 extern int
840 ncx_putn_float_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
841 extern int
842 ncx_putn_float_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
843 extern int
844 ncx_putn_float_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
845 extern int
846 ncx_putn_float_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
847 extern int
848 ncx_putn_float_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
849 extern int
850 ncx_putn_float_double(void **xpp, size_t nelems, const double *ip, void *fillp);
851 extern int
852 ncx_putn_float_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
853 extern int
854 ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
855 
856 /*---- double ---------------------------------------------------------------*/
857 extern int
858 ncx_getn_double_schar (const void **xpp, size_t nelems, schar  *ip);
859 extern int
860 ncx_getn_double_uchar (const void **xpp, size_t nelems, uchar  *ip);
861 extern int
862 ncx_getn_double_short (const void **xpp, size_t nelems, short  *ip);
863 extern int
864 ncx_getn_double_ushort(const void **xpp, size_t nelems, ushort  *ip);
865 extern int
866 ncx_getn_double_int   (const void **xpp, size_t nelems, int    *ip);
867 extern int
868 ncx_getn_double_uint  (const void **xpp, size_t nelems, uint   *ip);
869 extern int
870 ncx_getn_double_long  (const void **xpp, size_t nelems, long   *ip);
871 extern int
872 ncx_getn_double_float (const void **xpp, size_t nelems, float  *ip);
873 extern int
874 ncx_getn_double_double(const void **xpp, size_t nelems, double *ip);
875 extern int
876 ncx_getn_double_longlong (const void **xpp, size_t nelems, longlong  *ip);
877 extern int
878 ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
879 
880 extern int
881 ncx_putn_double_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
882 extern int
883 ncx_putn_double_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
884 extern int
885 ncx_putn_double_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
886 extern int
887 ncx_putn_double_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
888 extern int
889 ncx_putn_double_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
890 extern int
891 ncx_putn_double_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
892 extern int
893 ncx_putn_double_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
894 extern int
895 ncx_putn_double_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
896 extern int
897 ncx_putn_double_double(void **xpp, size_t nelems, const double *ip, void *fillp);
898 extern int
899 ncx_putn_double_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
900 extern int
901 ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
902 
903 /*---- longlong ----------------------------------------------------------------*/
904 extern int
905 ncx_getn_longlong_schar (const void **xpp, size_t nelems, schar  *ip);
906 extern int
907 ncx_getn_longlong_uchar (const void **xpp, size_t nelems, uchar  *ip);
908 extern int
909 ncx_getn_longlong_short (const void **xpp, size_t nelems, short  *ip);
910 extern int
911 ncx_getn_longlong_ushort(const void **xpp, size_t nelems, ushort  *ip);
912 extern int
913 ncx_getn_longlong_int   (const void **xpp, size_t nelems, int    *ip);
914 extern int
915 ncx_getn_longlong_uint  (const void **xpp, size_t nelems, uint   *ip);
916 extern int
917 ncx_getn_longlong_long  (const void **xpp, size_t nelems, long   *ip);
918 extern int
919 ncx_getn_longlong_float (const void **xpp, size_t nelems, float  *ip);
920 extern int
921 ncx_getn_longlong_double(const void **xpp, size_t nelems, double *ip);
922 extern int
923 ncx_getn_longlong_longlong (const void **xpp, size_t nelems, longlong  *ip);
924 extern int
925 ncx_getn_longlong_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
926 
927 extern int
928 ncx_putn_longlong_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
929 extern int
930 ncx_putn_longlong_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
931 extern int
932 ncx_putn_longlong_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
933 extern int
934 ncx_putn_longlong_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
935 extern int
936 ncx_putn_longlong_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
937 extern int
938 ncx_putn_longlong_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
939 extern int
940 ncx_putn_longlong_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
941 extern int
942 ncx_putn_longlong_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
943 extern int
944 ncx_putn_longlong_double(void **xpp, size_t nelems, const double *ip, void *fillp);
945 extern int
946 ncx_putn_longlong_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
947 extern int
948 ncx_putn_longlong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
949 
950 /*---- ulonglong ---------------------------------------------------------------*/
951 extern int
952 ncx_getn_ulonglong_schar (const void **xpp, size_t nelems, schar  *ip);
953 extern int
954 ncx_getn_ulonglong_uchar (const void **xpp, size_t nelems, uchar  *ip);
955 extern int
956 ncx_getn_ulonglong_short (const void **xpp, size_t nelems, short  *ip);
957 extern int
958 ncx_getn_ulonglong_ushort(const void **xpp, size_t nelems, ushort  *ip);
959 extern int
960 ncx_getn_ulonglong_int   (const void **xpp, size_t nelems, int    *ip);
961 extern int
962 ncx_getn_ulonglong_uint  (const void **xpp, size_t nelems, uint   *ip);
963 extern int
964 ncx_getn_ulonglong_long  (const void **xpp, size_t nelems, long   *ip);
965 extern int
966 ncx_getn_ulonglong_float (const void **xpp, size_t nelems, float  *ip);
967 extern int
968 ncx_getn_ulonglong_double(const void **xpp, size_t nelems, double *ip);
969 extern int
970 ncx_getn_ulonglong_longlong (const void **xpp, size_t nelems, longlong  *ip);
971 extern int
972 ncx_getn_ulonglong_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
973 
974 extern int
975 ncx_putn_ulonglong_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
976 extern int
977 ncx_putn_ulonglong_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
978 extern int
979 ncx_putn_ulonglong_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
980 extern int
981 ncx_putn_ulonglong_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
982 extern int
983 ncx_putn_ulonglong_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
984 extern int
985 ncx_putn_ulonglong_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
986 extern int
987 ncx_putn_ulonglong_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
988 extern int
989 ncx_putn_ulonglong_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
990 extern int
991 ncx_putn_ulonglong_double(void **xpp, size_t nelems, const double *ip, void *fillp);
992 extern int
993 ncx_putn_ulonglong_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
994 extern int
995 ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
996 
997 
998 /*
999  * Other aggregate conversion functions.
1000  */
1001 
1002 /* read ASCII characters */
1003 extern int
1004 ncx_getn_text(const void **xpp, size_t nchars, char *cp);
1005 extern int
1006 ncx_pad_getn_text(const void **xpp, size_t nchars, char *cp);
1007 
1008 /* write ASCII characters */
1009 extern int
1010 ncx_putn_text(void **xpp, size_t nchars, const char *cp);
1011 extern int
1012 ncx_pad_putn_text(void **xpp, size_t nchars, const char *cp);
1013 
1014 
1015 /* for symmetry */
1016 #define ncx_getn_char_char(xpp, nelems, fillp) ncx_getn_text(xpp, nelems, fillp)
1017 #define ncx_putn_char_char(xpp, nelems, fillp) ncx_putn_text(xpp, nelems, fillp)
1018 
1019 /* read opaque data */
1020 extern int
1021 ncx_getn_void(const void **xpp, size_t nchars, void *vp);
1022 extern int
1023 ncx_pad_getn_void(const void **xpp, size_t nchars, void *vp);
1024 
1025 /* write opaque data */
1026 extern int
1027 ncx_putn_void(void **xpp, size_t nchars, const void *vp);
1028 extern int
1029 ncx_pad_putn_void(void **xpp, size_t nchars, const void *vp);
1030 
1031 #endif /* _NCX_H_ */
1032