1 /*
2  *	Copyright 1996, University Corporation for Atmospheric Research
3  *	See netcdf/COPYRIGHT file for copying and redistribution conditions.
4  */
5 /* "$Id: ncx.h,v 1.65 2010/05/26 18:11:08 dmh Exp $" */
6 
7 #ifndef _NCX_H_
8 #define _NCX_H_
9 
10 #include "ncdispatch.h"
11 
12 /*
13  * An external data representation interface.
14 
15  *
16  * This started out as a general replacement for ONC XDR,
17  * specifically, the xdrmem family of functions.
18  *
19  * We eventually realized that we could write more portable
20  * code if we decoupled any association between the 'C' types
21  * and the external types. (XDR has this association between the 'C'
22  * types and the external representations, like xdr_int() takes
23  * an int argument and goes to an external int representation.)
24  * So, now there is a matrix of functions.
25  *
26  */
27 
28 #include <config.h> /* output of 'configure' */
29 #include "rnd.h"
30 #include <stddef.h> /* size_t */
31 #include <errno.h>
32 #include <sys/types.h> /* off_t */
33 
34 #ifdef _MSC_VER
35 #  pragma warning ( disable : 4244 )
36 #endif
37 
38 /* Define uchar if it is not defined on this system. */
39 #ifndef HAVE_UCHAR
40 typedef unsigned char uchar;
41 #endif
42 
43 #ifndef uint
44 typedef unsigned int uint;
45 #endif
46 #define longlong long long
47 
48 #if defined(_CRAY) && !defined(_CRAYIEEE) && !defined(__crayx1)
49 #define CRAYFLOAT 1 /* CRAY Floating point */
50 #elif defined(_SX) && defined(_FLOAT2)	/* NEC SUPER-UX in CRAY mode */
51 #define CRAYFLOAT 1 /* CRAY Floating point */
52 #endif
53 
54 /*
55  * The integer return code for the conversion routines
56  * is 0 (ENOERR) when no error occured, or NC_ERANGE as appropriate
57  * for an overflow conversion.
58  */
59 #ifndef ENOERR
60 #define ENOERR 0
61 #endif
62 #ifndef NC_ERANGE
63 #define NC_ERANGE (-60) /* N.B. must match value in xxxnetcdf.h */
64 #endif
65 #ifndef NC_ENOMEM
66 #define NC_ENOMEM (-61) /* N.B. must match value in xxxnetcdf.h */
67 #endif
68 
69 
70 /*
71  * External sizes of the primitive elements.
72  */
73 #define X_SIZEOF_CHAR		1
74 #define X_SIZEOF_SHORT		2
75 #define X_SIZEOF_INT		4	/* xdr_int */
76 #if 0
77 #define X_SIZEOF_LONG		8 */	/* xdr_long_long */
78 #endif
79 #define X_SIZEOF_FLOAT		4
80 #define X_SIZEOF_DOUBLE		8
81 
82 /*
83  * For now, netcdf is limited to 32 bit sizes,
84  * If compiled with support for "large files", then
85  * netcdf will use a 64 bit off_t and it can then write a file
86  * using 64 bit offsets.
87  *  see also X_SIZE_MAX, X_OFF_MAX below
88  */
89 #define X_SIZEOF_OFF_T		(sizeof(off_t))
90 #define X_SIZEOF_SIZE_T		X_SIZEOF_INT
91 
92 /*
93  * limits of the external representation
94  */
95 #define X_SCHAR_MIN	(-128)
96 #define X_SCHAR_MAX	127
97 #define X_UCHAR_MAX	255U
98 #define X_SHORT_MIN	(-32768)
99 #define X_SHRT_MIN	X_SHORT_MIN	/* alias compatible with limits.h */
100 #define X_SHORT_MAX	32767
101 #define X_SHRT_MAX	X_SHORT_MAX	/* alias compatible with limits.h */
102 #define X_USHORT_MAX	65535U
103 #define X_USHRT_MAX	X_USHORT_MAX	/* alias compatible with limits.h */
104 #define X_INT_MIN	(-2147483647-1)
105 #define X_INT_MAX	2147483647
106 #define X_UINT_MAX	4294967295U
107 #define X_FLOAT_MAX	3.402823466e+38f
108 #define X_FLOAT_MIN	(-X_FLOAT_MAX)
109 #define X_FLT_MAX	X_FLOAT_MAX	/* alias compatible with limits.h */
110 #if CRAYFLOAT
111 /* ldexp(1. - ldexp(.5 , -46), 1024) */
112 #define X_DOUBLE_MAX    1.79769313486230e+308
113 #else
114 /* scalb(1. - scalb(.5 , -52), 1024) */
115 #define X_DOUBLE_MAX	1.7976931348623157e+308
116 #endif
117 #define X_DOUBLE_MIN	(-X_DOUBLE_MAX)
118 #define X_DBL_MAX	X_DOUBLE_MAX	/* alias compatible with limits.h */
119 
120 #define X_SIZE_MAX	X_UINT_MAX
121 #define X_OFF_MAX	X_INT_MAX
122 
123 
124 /* Begin ncx_len */
125 
126 /*
127  * ncx_len_xxx() interfaces are defined as macros below,
128  * These give the length of an array of nelems of the type.
129  * N.B. The 'char' and 'short' interfaces give the X_ALIGNED length.
130  */
131 #define X_ALIGN			4	/* a.k.a. BYTES_PER_XDR_UNIT */
132 
133 #define ncx_len_char(nelems) \
134 	_RNDUP((nelems), X_ALIGN)
135 
136 #define ncx_len_short(nelems) \
137 	(((nelems) + (nelems)%2)  * X_SIZEOF_SHORT)
138 
139 #define ncx_len_int(nelems) \
140 	((nelems) * X_SIZEOF_INT)
141 
142 #define ncx_len_long(nelems) \
143 	((nelems) * X_SIZEOF_LONG)
144 
145 #define ncx_len_float(nelems) \
146 	((nelems) * X_SIZEOF_FLOAT)
147 
148 #define ncx_len_double(nelems) \
149 	((nelems) * X_SIZEOF_DOUBLE)
150 
151 /* End ncx_len */
152 
153 #if __CHAR_UNSIGNED__
154 	/* 'char' is unsigned, declare ncbyte as 'signed char' */
155 typedef signed char schar;
156 
157 #else
158 	/* 'char' is signed */
159 typedef signed char schar;
160 
161 #endif	/* __CHAR_UNSIGNED__ */
162 
163 /*
164  * Primitive numeric conversion functions.
165  * The `put' functions convert from native internal
166  * type to the external type, while the `get' functions
167  * convert from the external to the internal.
168  *
169  * These take the form
170  *	int ncx_get_{external_type}_{internal_type}(
171  *		const void *xp,
172  *		internal_type *ip
173  *	);
174  *	int ncx_put_{external_type}_{internal_type}(
175  *		void *xp,
176  *		const internal_type *ip
177  *	);
178  * where
179  *	`external_type' and `internal_type' chosen from
180 		schar
181 		uchar
182 		short
183 		ushort
184 		int
185 		uint
186 		long
187 		ulong
188 		float
189 		double
190  *
191  * Not all combinations make sense.
192  * We may not implement all combinations that make sense.
193  * The netcdf functions that use this ncx interface don't
194  * use these primitive conversion functions. They use the
195  * aggregate conversion functions declared below.
196  *
197  * Storage for a single element of external type is at the `void * xp'
198  * argument.
199  *
200  * Storage for a single element of internal type is at `ip' argument.
201  *
202  * These functions return 0 (ENOERR) when no error occured,
203  * or NC_ERANGE when the value being converted is too large.
204  * When NC_ERANGE occurs, an undefined (implementation dependent)
205  * conversion may have occured.
206  *
207  * Note that loss of precision may occur silently.
208  *
209  */
210 
211 #if 0
212 extern int
213 ncx_get_schar_schar(const void *xp, schar *ip);
214 extern int
215 ncx_get_schar_uchar(const void *xp, uchar *ip);
216 extern int
217 ncx_get_schar_short(const void *xp, short *ip);
218 extern int
219 ncx_get_schar_int(const void *xp, int *ip);
220 extern int
221 ncx_get_schar_long(const void *xp, long *ip);
222 extern int
223 ncx_get_schar_float(const void *xp, float *ip);
224 extern int
225 ncx_get_schar_double(const void *xp, double *ip);
226 
227 extern int
228 ncx_put_schar_schar(void *xp, const schar *ip);
229 extern int
230 ncx_put_schar_uchar(void *xp, const uchar *ip);
231 extern int
232 ncx_put_schar_short(void *xp, const short *ip);
233 extern int
234 ncx_put_schar_int(void *xp, const int *ip);
235 extern int
236 ncx_put_schar_long(void *xp, const long *ip);
237 extern int
238 ncx_put_schar_float(void *xp, const float *ip);
239 extern int
240 ncx_put_schar_double(void *xp, const double *ip);
241 #endif
242 
243 
244 extern int
245 ncx_get_short_schar(const void *xp, schar *ip);
246 extern int
247 ncx_get_short_uchar(const void *xp, uchar *ip);
248 extern int
249 ncx_get_short_short(const void *xp, short *ip);
250 extern int
251 ncx_get_short_int(const void *xp, int *ip);
252 extern int
253 ncx_get_short_long(const void *xp, long *ip);
254 extern int
255 ncx_get_short_float(const void *xp, float *ip);
256 extern int
257 ncx_get_short_double(const void *xp, double *ip);
258 
259 extern int
260 ncx_put_short_schar(void *xp, const schar *ip);
261 extern int
262 ncx_put_short_uchar(void *xp, const uchar *ip);
263 extern int
264 ncx_put_short_short(void *xp, const short *ip);
265 extern int
266 ncx_put_short_int(void *xp, const int *ip);
267 extern int
268 ncx_put_short_long(void *xp, const long *ip);
269 extern int
270 ncx_put_short_float(void *xp, const float *ip);
271 extern int
272 ncx_put_short_double(void *xp, const double *ip);
273 
274 
275 extern int
276 ncx_get_int_schar(const void *xp, schar *ip);
277 extern int
278 ncx_get_int_uchar(const void *xp, uchar *ip);
279 extern int
280 ncx_get_int_short(const void *xp, short *ip);
281 extern int
282 ncx_get_int_int(const void *xp, int *ip);
283 extern int
284 ncx_get_int_long(const void *xp, long *ip);
285 extern int
286 ncx_get_int_float(const void *xp, float *ip);
287 extern int
288 ncx_get_int_double(const void *xp, double *ip);
289 
290 extern int
291 ncx_put_int_schar(void *xp, const schar *ip);
292 extern int
293 ncx_put_int_uchar(void *xp, const uchar *ip);
294 extern int
295 ncx_put_int_short(void *xp, const short *ip);
296 extern int
297 ncx_put_int_int(void *xp, const int *ip);
298 extern int
299 ncx_put_int_long(void *xp, const long *ip);
300 extern int
301 ncx_put_int_float(void *xp, const float *ip);
302 extern int
303 ncx_put_int_double(void *xp, const double *ip);
304 
305 
306 extern int
307 ncx_get_float_schar(const void *xp, schar *ip);
308 extern int
309 ncx_get_float_uchar(const void *xp, uchar *ip);
310 extern int
311 ncx_get_float_short(const void *xp, short *ip);
312 extern int
313 ncx_get_float_int(const void *xp, int *ip);
314 extern int
315 ncx_get_float_long(const void *xp, long *ip);
316 extern int
317 ncx_get_float_float(const void *xp, float *ip);
318 extern int
319 ncx_get_float_double(const void *xp, double *ip);
320 
321 extern int
322 ncx_put_float_schar(void *xp, const schar *ip);
323 extern int
324 ncx_put_float_uchar(void *xp, const uchar *ip);
325 extern int
326 ncx_put_float_short(void *xp, const short *ip);
327 extern int
328 ncx_put_float_int(void *xp, const int *ip);
329 extern int
330 ncx_put_float_long(void *xp, const long *ip);
331 extern int
332 ncx_put_float_float(void *xp, const float *ip);
333 extern int
334 ncx_put_float_double(void *xp, const double *ip);
335 
336 
337 extern int
338 ncx_get_double_schar(const void *xp, schar *ip);
339 extern int
340 ncx_get_double_uchar(const void *xp, uchar *ip);
341 extern int
342 ncx_get_double_short(const void *xp, short *ip);
343 extern int
344 ncx_get_double_int(const void *xp, int *ip);
345 extern int
346 ncx_get_double_long(const void *xp, long *ip);
347 extern int
348 ncx_get_double_float(const void *xp, float *ip);
349 extern int
350 ncx_get_double_double(const void *xp, double *ip);
351 
352 extern int
353 ncx_put_double_schar(void *xp, const schar *ip);
354 extern int
355 ncx_put_double_uchar(void *xp, const uchar *ip);
356 extern int
357 ncx_put_double_short(void *xp, const short *ip);
358 extern int
359 ncx_put_double_int(void *xp, const int *ip);
360 extern int
361 ncx_put_double_long(void *xp, const long *ip);
362 extern int
363 ncx_put_double_float(void *xp, const float *ip);
364 extern int
365 ncx_put_double_double(void *xp, const double *ip);
366 
367 
368 /*
369  * Other primitive conversion functions
370  * N.B. slightly different interface
371  * Used by netcdf.
372  */
373 
374 /* ncx_get_int_size_t */
375 extern int
376 ncx_get_size_t(const void **xpp, size_t *ulp);
377 /* ncx_get_int_off_t */
378 extern int
379 ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t);
380 
381 /* ncx_put_int_size_t */
382 extern int
383 ncx_put_size_t(void **xpp, const size_t *ulp);
384 /* ncx_put_int_off_t */
385 extern int
386 ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t);
387 
388 
389 /*
390  * Aggregate numeric conversion functions.
391  * Convert an array.  Replaces xdr_array(...).
392  * These functions are used by netcdf. Unlike the xdr
393  * interface, we optimize for aggregate conversions.
394  * This functions should be implemented to take advantage
395  * of multiple processor / parallel hardware where available.
396  *
397  * These take the form
398  *	int ncx_getn_{external_type}_{internal_type}(
399  *		const void *xpp,
400  *		size_t nelems,
401  *		internal_type *ip
402  *	);
403  *	int ncx_putn_{external_type}_{internal_type}(
404  *		void **xpp,
405  *		size_t nelems,
406  *		const internal_type *ip
407  *	);
408  * Where the types are as in the primitive numeric conversion functions.
409  *
410  * The value of the pointer to pointer argument, *xpp, is
411  * expected to reference storage for `nelems' of the external
412  * type.  On return, it modified to reference just past the last
413  * converted external element.
414  *
415  * The types whose external size is less than X_ALIGN also have `pad'
416  * interfaces. These round (and zero fill on put) *xpp up to X_ALIGN
417  * boundaries. (This is the usual xdr behavior.)
418  *
419  * The `ip' argument should point to an array of `nelems' of
420  * internal_type.
421  *
422  * Range errors (NC_ERANGE) for a individual values in the array
423  * DO NOT terminate the array conversion. All elements are converted,
424  * with some having undefined values.
425  * If any range error occurs, the function returns NC_ERANGE.
426  *
427  */
428 
429 extern int
430 ncx_getn_schar_schar(const void **xpp, size_t nelems, schar *ip);
431 extern int
432 ncx_getn_schar_uchar(const void **xpp, size_t nelems, uchar *ip);
433 extern int
434 ncx_getn_schar_short(const void **xpp, size_t nelems, short *ip);
435 extern int
436 ncx_getn_schar_int(const void **xpp, size_t nelems, int *ip);
437 extern int
438 ncx_getn_schar_long(const void **xpp, size_t nelems, long *ip);
439 extern int
440 ncx_getn_schar_float(const void **xpp, size_t nelems, float *ip);
441 extern int
442 ncx_getn_schar_double(const void **xpp, size_t nelems, double *ip);
443 extern int
444 ncx_getn_schar_uint(const void **xpp, size_t nelems, unsigned int *ip);
445 extern int
446 ncx_getn_schar_longlong(const void **xpp, size_t nelems, longlong *ip);
447 extern int
448 ncx_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
449 
450 extern int
451 ncx_pad_getn_schar_schar(const void **xpp, size_t nelems, schar *ip);
452 extern int
453 ncx_pad_getn_schar_uchar(const void **xpp, size_t nelems, uchar *ip);
454 extern int
455 ncx_pad_getn_schar_short(const void **xpp, size_t nelems, short *ip);
456 extern int
457 ncx_pad_getn_schar_int(const void **xpp, size_t nelems, int *ip);
458 extern int
459 ncx_pad_getn_schar_long(const void **xpp, size_t nelems, long *ip);
460 extern int
461 ncx_pad_getn_schar_float(const void **xpp, size_t nelems, float *ip);
462 extern int
463 ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *ip);
464 extern int
465 ncx_pad_getn_schar_uint(const void **xpp, size_t nelems, unsigned int *ip);
466 extern int
467 ncx_pad_getn_schar_longlong(const void **xpp, size_t nelems, longlong *ip);
468 extern int
469 ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
470 
471 extern int
472 ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *ip);
473 extern int
474 ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *ip);
475 extern int
476 ncx_putn_schar_short(void **xpp, size_t nelems, const short *ip);
477 extern int
478 ncx_putn_schar_int(void **xpp, size_t nelems, const int *ip);
479 extern int
480 ncx_putn_schar_long(void **xpp, size_t nelems, const long *ip);
481 extern int
482 ncx_putn_schar_float(void **xpp, size_t nelems, const float *ip);
483 extern int
484 ncx_putn_schar_double(void **xpp, size_t nelems, const double *ip);
485 extern int
486 ncx_putn_schar_uint(void **xpp, size_t nelems, const unsigned int *ip);
487 extern int
488 ncx_putn_schar_longlong(void **xpp, size_t nelems, const longlong *ip);
489 extern int
490 ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
491 
492 extern int
493 ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *ip);
494 extern int
495 ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *ip);
496 extern int
497 ncx_pad_putn_schar_short(void **xpp, size_t nelems, const short *ip);
498 extern int
499 ncx_pad_putn_schar_int(void **xpp, size_t nelems, const int *ip);
500 extern int
501 ncx_pad_putn_schar_long(void **xpp, size_t nelems, const long *ip);
502 extern int
503 ncx_pad_putn_schar_float(void **xpp, size_t nelems, const float *ip);
504 extern int
505 ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *ip);
506 extern int
507 ncx_pad_putn_schar_uint(void **xpp, size_t nelems, const unsigned int *ip);
508 extern int
509 ncx_pad_putn_schar_longlong(void **xpp, size_t nelems, const longlong *ip);
510 extern int
511 ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
512 
513 
514 extern int
515 ncx_getn_short_schar(const void **xpp, size_t nelems, schar *ip);
516 extern int
517 ncx_getn_short_uchar(const void **xpp, size_t nelems, uchar *ip);
518 extern int
519 ncx_getn_short_short(const void **xpp, size_t nelems, short *ip);
520 extern int
521 ncx_getn_short_int(const void **xpp, size_t nelems, int *ip);
522 extern int
523 ncx_getn_short_long(const void **xpp, size_t nelems, long *ip);
524 extern int
525 ncx_getn_short_float(const void **xpp, size_t nelems, float *ip);
526 extern int
527 ncx_getn_short_double(const void **xpp, size_t nelems, double *ip);
528 extern int
529 ncx_getn_short_uint(const void **xpp, size_t nelems, unsigned int *ip);
530 extern int
531 ncx_getn_short_longlong(const void **xpp, size_t nelems, longlong *ip);
532 extern int
533 ncx_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
534 
535 extern int
536 ncx_pad_getn_short_schar(const void **xpp, size_t nelems, schar *ip);
537 extern int
538 ncx_pad_getn_short_uchar(const void **xpp, size_t nelems, uchar *ip);
539 extern int
540 ncx_pad_getn_short_short(const void **xpp, size_t nelems, short *ip);
541 extern int
542 ncx_pad_getn_short_int(const void **xpp, size_t nelems, int *ip);
543 extern int
544 ncx_pad_getn_short_long(const void **xpp, size_t nelems, long *ip);
545 extern int
546 ncx_pad_getn_short_float(const void **xpp, size_t nelems, float *ip);
547 extern int
548 ncx_pad_getn_short_double(const void **xpp, size_t nelems, double *ip);
549 extern int
550 ncx_pad_getn_short_uint(const void **xpp, size_t nelems, unsigned int *ip);
551 extern int
552 ncx_pad_getn_short_longlong(const void **xpp, size_t nelems, longlong *ip);
553 extern int
554 ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
555 
556 extern int
557 ncx_putn_short_schar(void **xpp, size_t nelems, const schar *ip);
558 extern int
559 ncx_putn_short_uchar(void **xpp, size_t nelems, const uchar *ip);
560 extern int
561 ncx_putn_short_short(void **xpp, size_t nelems, const short *ip);
562 extern int
563 ncx_putn_short_int(void **xpp, size_t nelems, const int *ip);
564 extern int
565 ncx_putn_short_long(void **xpp, size_t nelems, const long *ip);
566 extern int
567 ncx_putn_short_float(void **xpp, size_t nelems, const float *ip);
568 extern int
569 ncx_putn_short_double(void **xpp, size_t nelems, const double *ip);
570 extern int
571 ncx_putn_short_uint(void **xpp, size_t nelems, const unsigned int *ip);
572 extern int
573 ncx_putn_short_longlong(void **xpp, size_t nelems, const longlong *ip);
574 extern int
575 ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
576 
577 extern int
578 ncx_pad_putn_short_schar(void **xpp, size_t nelems, const schar *ip);
579 extern int
580 ncx_pad_putn_short_uchar(void **xpp, size_t nelems, const uchar *ip);
581 extern int
582 ncx_pad_putn_short_short(void **xpp, size_t nelems, const short *ip);
583 extern int
584 ncx_pad_putn_short_int(void **xpp, size_t nelems, const int *ip);
585 extern int
586 ncx_pad_putn_short_long(void **xpp, size_t nelems, const long *ip);
587 extern int
588 ncx_pad_putn_short_float(void **xpp, size_t nelems, const float *ip);
589 extern int
590 ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *ip);
591 extern int
592 ncx_pad_putn_short_uint(void **xpp, size_t nelems, const unsigned int *ip);
593 extern int
594 ncx_pad_putn_short_longlong(void **xpp, size_t nelems, const longlong *ip);
595 extern int
596 ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
597 
598 
599 extern int
600 ncx_getn_int_schar(const void **xpp, size_t nelems, schar *ip);
601 extern int
602 ncx_getn_int_uchar(const void **xpp, size_t nelems, uchar *ip);
603 extern int
604 ncx_getn_int_short(const void **xpp, size_t nelems, short *ip);
605 extern int
606 ncx_getn_int_int(const void **xpp, size_t nelems, int *ip);
607 extern int
608 ncx_getn_int_long(const void **xpp, size_t nelems, long *ip);
609 extern int
610 ncx_getn_int_float(const void **xpp, size_t nelems, float *ip);
611 extern int
612 ncx_getn_int_double(const void **xpp, size_t nelems, double *ip);
613 extern int
614 ncx_getn_int_uint(const void **xpp, size_t nelems, unsigned int *ip);
615 extern int
616 ncx_getn_int_longlong(const void **xpp, size_t nelems, longlong *ip);
617 extern int
618 ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
619 
620 extern int
621 ncx_putn_int_schar(void **xpp, size_t nelems, const schar *ip);
622 extern int
623 ncx_putn_int_uchar(void **xpp, size_t nelems, const uchar *ip);
624 extern int
625 ncx_putn_int_short(void **xpp, size_t nelems, const short *ip);
626 extern int
627 ncx_putn_int_int(void **xpp, size_t nelems, const int *ip);
628 extern int
629 ncx_putn_int_long(void **xpp, size_t nelems, const long *ip);
630 extern int
631 ncx_putn_int_float(void **xpp, size_t nelems, const float *ip);
632 extern int
633 ncx_putn_int_double(void **xpp, size_t nelems, const double *ip);
634 extern int
635 ncx_putn_int_uint(void **xpp, size_t nelems, const unsigned int *ip);
636 extern int
637 ncx_putn_int_longlong(void **xpp, size_t nelems, const longlong *ip);
638 extern int
639 ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
640 
641 
642 extern int
643 ncx_getn_float_schar(const void **xpp, size_t nelems, schar *ip);
644 extern int
645 ncx_getn_float_uchar(const void **xpp, size_t nelems, uchar *ip);
646 extern int
647 ncx_getn_float_short(const void **xpp, size_t nelems, short *ip);
648 extern int
649 ncx_getn_float_int(const void **xpp, size_t nelems, int *ip);
650 extern int
651 ncx_getn_float_long(const void **xpp, size_t nelems, long *ip);
652 extern int
653 ncx_getn_float_float(const void **xpp, size_t nelems, float *ip);
654 extern int
655 ncx_getn_float_double(const void **xpp, size_t nelems, double *ip);
656 extern int
657 ncx_getn_float_uint(const void **xpp, size_t nelems, unsigned int *ip);
658 extern int
659 ncx_getn_float_longlong(const void **xpp, size_t nelems, longlong *ip);
660 extern int
661 ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
662 
663 extern int
664 ncx_putn_float_schar(void **xpp, size_t nelems, const schar *ip);
665 extern int
666 ncx_putn_float_uchar(void **xpp, size_t nelems, const uchar *ip);
667 extern int
668 ncx_putn_float_short(void **xpp, size_t nelems, const short *ip);
669 extern int
670 ncx_putn_float_int(void **xpp, size_t nelems, const int *ip);
671 extern int
672 ncx_putn_float_long(void **xpp, size_t nelems, const long *ip);
673 extern int
674 ncx_putn_float_float(void **xpp, size_t nelems, const float *ip);
675 extern int
676 ncx_putn_float_double(void **xpp, size_t nelems, const double *ip);
677 extern int
678 ncx_putn_float_uint(void **xpp, size_t nelems, const unsigned int *ip);
679 extern int
680 ncx_putn_float_longlong(void **xpp, size_t nelems, const longlong *ip);
681 extern int
682 ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
683 
684 
685 extern int
686 ncx_getn_double_schar(const void **xpp, size_t nelems, schar *ip);
687 extern int
688 ncx_getn_double_uchar(const void **xpp, size_t nelems, uchar *ip);
689 extern int
690 ncx_getn_double_short(const void **xpp, size_t nelems, short *ip);
691 extern int
692 ncx_getn_double_int(const void **xpp, size_t nelems, int *ip);
693 extern int
694 ncx_getn_double_long(const void **xpp, size_t nelems, long *ip);
695 extern int
696 ncx_getn_double_float(const void **xpp, size_t nelems, float *ip);
697 extern int
698 ncx_getn_double_double(const void **xpp, size_t nelems, double *ip);
699 extern int
700 ncx_getn_double_uint(const void **xpp, size_t nelems, unsigned int *ip);
701 extern int
702 ncx_getn_double_longlong(const void **xpp, size_t nelems, longlong *ip);
703 extern int
704 ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
705 
706 extern int
707 ncx_putn_double_schar(void **xpp, size_t nelems, const schar *ip);
708 extern int
709 ncx_putn_double_uchar(void **xpp, size_t nelems, const uchar *ip);
710 extern int
711 ncx_putn_double_short(void **xpp, size_t nelems, const short *ip);
712 extern int
713 ncx_putn_double_int(void **xpp, size_t nelems, const int *ip);
714 extern int
715 ncx_putn_double_long(void **xpp, size_t nelems, const long *ip);
716 extern int
717 ncx_putn_double_float(void **xpp, size_t nelems, const float *ip);
718 extern int
719 ncx_putn_double_double(void **xpp, size_t nelems, const double *ip);
720 extern int
721 ncx_putn_double_uint(void **xpp, size_t nelems, const unsigned int *ip);
722 extern int
723 ncx_putn_double_longlong(void **xpp, size_t nelems, const longlong *ip);
724 extern int
725 ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
726 
727 
728 /*
729  * Other aggregate conversion functions.
730  */
731 
732 /* read ASCII characters */
733 extern int
734 ncx_getn_text(const void **xpp, size_t nchars, char *cp);
735 extern int
736 ncx_pad_getn_text(const void **xpp, size_t nchars, char *cp);
737 
738 /* write ASCII characters */
739 extern int
740 ncx_putn_text(void **xpp, size_t nchars, const char *cp);
741 extern int
742 ncx_pad_putn_text(void **xpp, size_t nchars, const char *cp);
743 
744 /* for symmetry */
745 #define ncx_getn_char_char(xpp, nelems, fillp) ncx_getn_text(xpp, nelems, fillp)
746 #define ncx_putn_char_char(xpp, nelems, fillp) ncx_putn_text(xpp, nelems, fillp)
747 
748 /* read opaque data */
749 extern int
750 ncx_getn_void(const void **xpp, size_t nchars, void *vp);
751 extern int
752 ncx_pad_getn_void(const void **xpp, size_t nchars, void *vp);
753 
754 /* write opaque data */
755 extern int
756 ncx_putn_void(void **xpp, size_t nchars, const void *vp);
757 extern int
758 ncx_pad_putn_void(void **xpp, size_t nchars, const void *vp);
759 
760 #endif /* _NCX_H_ */
761