Coverage Report

Created: 2025-09-04 06:20

/src/hdf5/src/H5Tconv.c
Line
Count
Source (jump to first uncovered line)
1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
 * Copyright by The HDF Group.                                               *
3
 * All rights reserved.                                                      *
4
 *                                                                           *
5
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
6
 * terms governing use, modification, and redistribution, is contained in    *
7
 * the LICENSE file, which can be found at the root of the source code       *
8
 * distribution tree, or in https://www.hdfgroup.org/licenses.               *
9
 * If you do not have access to either file, you may request a copy from     *
10
 * help@hdfgroup.org.                                                        *
11
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12
13
/*
14
 * Module Info: General datatype conversion and conversion-related functions
15
 *              for the H5T interface. Conversion functions for specific
16
 *              datatype classes are in separate files.
17
 */
18
19
/****************/
20
/* Module Setup */
21
/****************/
22
23
#include "H5Tmodule.h" /* This source code file is part of the H5T module */
24
25
/***********/
26
/* Headers */
27
/***********/
28
#include "H5private.h"   /* Generic Functions                        */
29
#include "H5CXprivate.h" /* API Contexts                             */
30
#include "H5Eprivate.h"  /* Error handling                           */
31
#include "H5Tconv.h"     /* Datatype Conversions                     */
32
#include "H5Tpkg.h"      /* Datatypes                                */
33
34
/****************/
35
/* Local Macros */
36
/****************/
37
38
/******************/
39
/* Local Typedefs */
40
/******************/
41
42
/********************/
43
/* Package Typedefs */
44
/********************/
45
46
/********************/
47
/* Local Prototypes */
48
/********************/
49
50
/*********************/
51
/* Public Variables */
52
/*********************/
53
54
/*********************/
55
/* Package Variables */
56
/*********************/
57
58
/*****************************/
59
/* Library Private Variables */
60
/*****************************/
61
62
/*******************/
63
/* Local Variables */
64
/*******************/
65
66
/*-------------------------------------------------------------------------
67
 * Function:    H5T_reclaim
68
 *
69
 * Purpose:     Frees the buffers allocated for storing variable-length
70
 *              data in memory. Only frees the VL data in the selection
71
 *              defined in the
72
 *              dataspace.
73
 *
74
 * Return:      Non-negative on success/Negative on failure
75
 *
76
 *-------------------------------------------------------------------------
77
 */
78
herr_t
79
H5T_reclaim(const H5T_t *type, H5S_t *space, void *buf)
80
0
{
81
0
    H5S_sel_iter_op_t     dset_op;          /* Operator for iteration */
82
0
    H5T_vlen_alloc_info_t vl_alloc_info;    /* VL allocation info */
83
0
    herr_t                ret_value = FAIL; /* Return value */
84
85
0
    FUNC_ENTER_NOAPI_NOINIT
86
87
    /* Check args */
88
0
    assert(type);
89
0
    assert(space);
90
0
    assert(buf);
91
92
    /* Get the allocation info */
93
0
    if (H5CX_get_vlen_alloc_info(&vl_alloc_info) < 0)
94
0
        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to retrieve VL allocation info");
95
96
    /* Call H5S_select_iterate with args, etc. */
97
0
    dset_op.op_type  = H5S_SEL_ITER_OP_LIB;
98
0
    dset_op.u.lib_op = H5T_reclaim_cb;
99
100
0
    ret_value = H5S_select_iterate(buf, type, space, &dset_op, &vl_alloc_info);
101
102
0
done:
103
0
    FUNC_LEAVE_NOAPI(ret_value)
104
0
} /* end H5T_reclaim() */
105
106
/*-------------------------------------------------------------------------
107
 * Function:    H5T_reclaim_cb
108
 *
109
 * Purpose:     Iteration callback to reclaim conversion allocated memory
110
 *              for a buffer element.
111
 *
112
 * Return:      Non-negative on success/Negative on failure
113
 *
114
 *-------------------------------------------------------------------------
115
 */
116
herr_t
117
H5T_reclaim_cb(void *elem, const H5T_t *dt, unsigned H5_ATTR_UNUSED ndim, const hsize_t H5_ATTR_UNUSED *point,
118
               void *op_data)
119
0
{
120
0
    herr_t ret_value = SUCCEED; /* Return value */
121
122
0
    FUNC_ENTER_NOAPI_NOINIT
123
124
    /* Sanity check */
125
0
    assert(elem);
126
0
    assert(dt);
127
128
0
    if (dt->shared->type == H5T_REFERENCE) {
129
0
        if (H5T__ref_reclaim(elem, dt) < 0)
130
0
            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "can't reclaim ref elements");
131
0
    }
132
0
    else {
133
0
        assert(op_data);
134
135
        /* Allow vlen reclaim to recurse into that routine */
136
0
        if (H5T__vlen_reclaim(elem, dt, (H5T_vlen_alloc_info_t *)op_data) < 0)
137
0
            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "can't reclaim vlen elements");
138
0
    }
139
140
0
done:
141
0
    FUNC_LEAVE_NOAPI(ret_value)
142
0
} /* end H5T_reclaim_cb() */
143
144
/*-------------------------------------------------------------------------
145
 * Function:  H5T_get_force_conv
146
 *
147
 * Purpose:   Determines if the type has forced conversion. This will be
148
 *            true if and only if the type keeps a pointer to a file VOL
149
 *            object internally.
150
 *
151
 * Return:    true/false (never fails)
152
 *
153
 *-------------------------------------------------------------------------
154
 */
155
bool
156
H5T_get_force_conv(const H5T_t *dt)
157
0
{
158
    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
159
0
    FUNC_ENTER_NOAPI_NOINIT_NOERR
160
161
    /* check args */
162
0
    assert(dt);
163
0
    assert(dt->shared);
164
165
0
    FUNC_LEAVE_NOAPI(dt->shared->force_conv)
166
0
} /* end H5T_get_force_conv() */
167
168
/*-------------------------------------------------------------------------
169
 * Function:    H5T__reverse_order
170
 *
171
 * Purpose:     Utility function to reverse the order of a sequence of
172
 *              bytes when it's big endian or VAX order. The byte sequence
173
 *              simulates the endian order.
174
 *
175
 * Return:      Non-negative on success/Negative on failure
176
 *
177
 *-------------------------------------------------------------------------
178
 */
179
herr_t
180
H5T__reverse_order(uint8_t *rev, uint8_t *s, const H5T_t *dtype)
181
0
{
182
0
    H5T_order_t order;
183
0
    size_t      size;
184
185
0
    FUNC_ENTER_PACKAGE_NOERR
186
187
0
    assert(s);
188
0
    assert(dtype);
189
0
    assert(H5T_IS_ATOMIC(dtype->shared) || H5T_COMPLEX == dtype->shared->type);
190
191
0
    size = dtype->shared->size;
192
193
0
    if (H5T_IS_ATOMIC(dtype->shared))
194
0
        order = dtype->shared->u.atomic.order;
195
0
    else
196
0
        order = dtype->shared->parent->shared->u.atomic.order;
197
198
0
    if (H5T_ORDER_VAX == order) {
199
0
        for (size_t i = 0; i < size; i += 2) {
200
0
            rev[i]     = s[(size - 2) - i];
201
0
            rev[i + 1] = s[(size - 1) - i];
202
0
        }
203
0
    }
204
0
    else if (H5T_ORDER_BE == order) {
205
0
        if (H5T_IS_ATOMIC(dtype->shared)) {
206
0
            for (size_t i = 0; i < size; i++)
207
0
                rev[size - (i + 1)] = s[i];
208
0
        }
209
0
        else {
210
0
            size_t part_size = size / 2;
211
0
            for (size_t i = 0; i < part_size; i++)
212
0
                rev[part_size - (i + 1)] = s[i];
213
0
            rev += part_size;
214
0
            s += part_size;
215
0
            for (size_t i = 0; i < part_size; i++)
216
0
                rev[part_size - (i + 1)] = s[i];
217
0
        }
218
0
    }
219
0
    else {
220
0
        for (size_t i = 0; i < size; i++)
221
0
            rev[i] = s[i];
222
0
    }
223
224
0
    FUNC_LEAVE_NOAPI(SUCCEED)
225
0
}
226
227
/*-------------------------------------------------------------------------
228
 * Function:    H5T__conv_noop
229
 *
230
 * Purpose:    The no-op conversion.  The library knows about this
231
 *        conversion without it being registered.
232
 *
233
 * Return:     Non-negative on success/Negative on failure
234
 *
235
 *-------------------------------------------------------------------------
236
 */
237
herr_t
238
H5T__conv_noop(const H5T_t H5_ATTR_UNUSED *src, const H5T_t H5_ATTR_UNUSED *dst, H5T_cdata_t *cdata,
239
               const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t H5_ATTR_UNUSED nelmts,
240
               size_t H5_ATTR_UNUSED buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void H5_ATTR_UNUSED *buf,
241
               void H5_ATTR_UNUSED *background)
242
4
{
243
4
    herr_t ret_value = SUCCEED; /* Return value */
244
245
4
    FUNC_ENTER_PACKAGE
246
247
4
    switch (cdata->command) {
248
2
        case H5T_CONV_INIT:
249
2
            cdata->need_bkg = H5T_BKG_NO;
250
2
            break;
251
252
0
        case H5T_CONV_CONV:
253
            /* Nothing to convert */
254
0
            break;
255
256
2
        case H5T_CONV_FREE:
257
2
            break;
258
259
0
        default:
260
0
            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command");
261
4
    } /* end switch */
262
263
4
done:
264
4
    FUNC_LEAVE_NOAPI(ret_value)
265
4
} /* end H5T__conv_noop() */
266
267
/*-------------------------------------------------------------------------
268
 * Function:    H5T__conv_order
269
 *
270
 * Purpose:     Convert one type to another when byte order is the only
271
 *              difference.
272
 *
273
 * Note:        This is a soft conversion function.
274
 *
275
 * Return:      Non-negative on success/Negative on failure
276
 *
277
 *-------------------------------------------------------------------------
278
 */
279
herr_t
280
H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata,
281
                const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t nelmts, size_t buf_stride,
282
                size_t H5_ATTR_UNUSED bkg_stride, void *_buf, void H5_ATTR_UNUSED *background)
283
0
{
284
0
    H5T_order_t src_order, dst_order;
285
0
    uint8_t    *buf = (uint8_t *)_buf;
286
0
    size_t      src_offset, dst_offset;
287
0
    size_t      src_size, dst_size;
288
0
    size_t      i;
289
0
    size_t      j, md;
290
0
    herr_t      ret_value = SUCCEED; /* Return value */
291
292
0
    FUNC_ENTER_PACKAGE
293
294
0
    switch (cdata->command) {
295
0
        case H5T_CONV_INIT:
296
            /* Capability query */
297
0
            if (NULL == src || NULL == dst)
298
0
                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype");
299
300
0
            src_size = src->shared->size;
301
0
            dst_size = dst->shared->size;
302
0
            if (src_size != dst_size)
303
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
304
305
0
            if (src->shared->parent) {
306
0
                if (!H5T_IS_ATOMIC(src->shared->parent->shared))
307
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
308
0
                src_offset = src->shared->parent->shared->u.atomic.offset;
309
0
                src_order  = src->shared->parent->shared->u.atomic.order;
310
0
            }
311
0
            else {
312
0
                src_offset = src->shared->u.atomic.offset;
313
0
                src_order  = src->shared->u.atomic.order;
314
0
            }
315
0
            if (dst->shared->parent) {
316
0
                if (!H5T_IS_ATOMIC(dst->shared->parent->shared))
317
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
318
0
                dst_offset = dst->shared->parent->shared->u.atomic.offset;
319
0
                dst_order  = dst->shared->parent->shared->u.atomic.order;
320
0
            }
321
0
            else {
322
0
                dst_offset = dst->shared->u.atomic.offset;
323
0
                dst_order  = dst->shared->u.atomic.order;
324
0
            }
325
326
0
            if (0 != src_offset || 0 != dst_offset)
327
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
328
329
0
            if (!((H5T_ORDER_BE == src_order && H5T_ORDER_LE == dst_order) ||
330
0
                  (H5T_ORDER_LE == src_order && H5T_ORDER_BE == dst_order)))
331
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
332
0
            switch (src->shared->type) {
333
0
                case H5T_INTEGER:
334
0
                case H5T_BITFIELD:
335
                    /* nothing to check */
336
0
                    break;
337
338
0
                case H5T_FLOAT:
339
0
                    if (src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
340
0
                        src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
341
0
                        src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
342
0
                        src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
343
0
                        src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
344
0
                        src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
345
0
                        src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
346
0
                        src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad) {
347
0
                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
348
0
                    } /* end if */
349
0
                    break;
350
351
0
                case H5T_COMPLEX: {
352
0
                    const H5T_shared_t *src_base_sh = src->shared->parent->shared;
353
0
                    const H5T_shared_t *dst_base_sh = dst->shared->parent->shared;
354
355
0
                    if (src_base_sh->u.atomic.u.f.sign != dst_base_sh->u.atomic.u.f.sign ||
356
0
                        src_base_sh->u.atomic.u.f.epos != dst_base_sh->u.atomic.u.f.epos ||
357
0
                        src_base_sh->u.atomic.u.f.esize != dst_base_sh->u.atomic.u.f.esize ||
358
0
                        src_base_sh->u.atomic.u.f.ebias != dst_base_sh->u.atomic.u.f.ebias ||
359
0
                        src_base_sh->u.atomic.u.f.mpos != dst_base_sh->u.atomic.u.f.mpos ||
360
0
                        src_base_sh->u.atomic.u.f.msize != dst_base_sh->u.atomic.u.f.msize ||
361
0
                        src_base_sh->u.atomic.u.f.norm != dst_base_sh->u.atomic.u.f.norm ||
362
0
                        src_base_sh->u.atomic.u.f.pad != dst_base_sh->u.atomic.u.f.pad)
363
0
                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
364
365
0
                    break;
366
0
                }
367
368
0
                case H5T_NO_CLASS:
369
0
                case H5T_TIME:
370
0
                case H5T_STRING:
371
0
                case H5T_OPAQUE:
372
0
                case H5T_COMPOUND:
373
0
                case H5T_REFERENCE:
374
0
                case H5T_ENUM:
375
0
                case H5T_VLEN:
376
0
                case H5T_ARRAY:
377
0
                case H5T_NCLASSES:
378
0
                default:
379
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
380
0
            } /* end switch */
381
0
            cdata->need_bkg = H5T_BKG_NO;
382
0
            break;
383
384
0
        case H5T_CONV_CONV:
385
            /* The conversion */
386
0
            if (NULL == src)
387
0
                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype");
388
389
0
            src_size   = src->shared->size;
390
0
            buf_stride = buf_stride ? buf_stride : src_size;
391
0
            md         = src_size / 2;
392
393
            /* Complex number types are composed of two floating-point
394
             * elements, each of which is half the size of the datatype
395
             * and have to be converted separately. While halving the
396
             * source datatype size and doubling the number elements to
397
             * be converted works in some cases, structure padding can
398
             * cause issues with that approach, so we special-case
399
             * conversions on complex numbers here.
400
             */
401
0
            if (H5T_COMPLEX == src->shared->type) {
402
0
                size_t part_size = src_size / 2;
403
404
0
                md = part_size / 2;
405
0
                for (i = 0; i < nelmts; i++, buf += buf_stride) {
406
0
                    uint8_t *cur_part = buf;
407
408
                    /* Convert real part of complex number element */
409
0
                    for (j = 0; j < md; j++)
410
0
                        H5_SWAP_BYTES(cur_part, j, part_size - (j + 1));
411
412
                    /* Convert imaginary part of complex number element */
413
0
                    cur_part += part_size;
414
0
                    for (j = 0; j < md; j++)
415
0
                        H5_SWAP_BYTES(cur_part, j, part_size - (j + 1));
416
0
                }
417
0
            }
418
0
            else {
419
0
                for (i = 0; i < nelmts; i++, buf += buf_stride)
420
0
                    for (j = 0; j < md; j++)
421
0
                        H5_SWAP_BYTES(buf, j, src_size - (j + 1));
422
0
            }
423
424
0
            break;
425
426
0
        case H5T_CONV_FREE:
427
            /* Free private data */
428
0
            break;
429
430
0
        default:
431
0
            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command");
432
0
    } /* end switch */
433
434
0
done:
435
0
    FUNC_LEAVE_NOAPI(ret_value)
436
0
} /* end H5T__conv_order() */
437
438
/*-------------------------------------------------------------------------
439
 * Function:    H5T__conv_order_opt
440
 *
441
 * Purpose:     Convert one type to another when byte order is the only
442
 *              difference. This is the optimized version of
443
 *              H5T__conv_order() for a handful of different sizes.
444
 *
445
 * Note:        This is a soft conversion function.
446
 *
447
 * Return:      Non-negative on success/Negative on failure
448
 *
449
 *-------------------------------------------------------------------------
450
 */
451
herr_t
452
H5T__conv_order_opt(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata,
453
                    const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t nelmts, size_t buf_stride,
454
                    size_t H5_ATTR_UNUSED bkg_stride, void *_buf, void H5_ATTR_UNUSED *background)
455
0
{
456
0
    H5T_order_t src_order, dst_order;
457
0
    uint8_t    *buf = (uint8_t *)_buf;
458
0
    size_t      src_offset, dst_offset;
459
0
    size_t      src_size, dst_size;
460
0
    size_t      i;
461
0
    herr_t      ret_value = SUCCEED; /* Return value */
462
463
0
    FUNC_ENTER_PACKAGE
464
465
0
    switch (cdata->command) {
466
0
        case H5T_CONV_INIT:
467
            /* Capability query */
468
0
            if (NULL == src || NULL == dst)
469
0
                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype");
470
471
0
            src_size = src->shared->size;
472
0
            dst_size = dst->shared->size;
473
0
            if (src_size != dst_size)
474
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
475
476
0
            if (src->shared->parent) {
477
0
                if (!H5T_IS_ATOMIC(src->shared->parent->shared))
478
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
479
0
                src_offset = src->shared->parent->shared->u.atomic.offset;
480
0
                src_order  = src->shared->parent->shared->u.atomic.order;
481
0
            }
482
0
            else {
483
0
                src_offset = src->shared->u.atomic.offset;
484
0
                src_order  = src->shared->u.atomic.order;
485
0
            }
486
0
            if (dst->shared->parent) {
487
0
                if (!H5T_IS_ATOMIC(dst->shared->parent->shared))
488
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
489
0
                dst_offset = dst->shared->parent->shared->u.atomic.offset;
490
0
                dst_order  = dst->shared->parent->shared->u.atomic.order;
491
0
            }
492
0
            else {
493
0
                dst_offset = dst->shared->u.atomic.offset;
494
0
                dst_order  = dst->shared->u.atomic.order;
495
0
            }
496
497
0
            if (0 != src_offset || 0 != dst_offset)
498
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
499
0
            if ((src->shared->type == H5T_REFERENCE && dst->shared->type != H5T_REFERENCE) ||
500
0
                (dst->shared->type == H5T_REFERENCE && src->shared->type != H5T_REFERENCE))
501
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
502
0
            if (src->shared->type != H5T_REFERENCE &&
503
0
                !((H5T_ORDER_BE == src_order && H5T_ORDER_LE == dst_order) ||
504
0
                  (H5T_ORDER_LE == src_order && H5T_ORDER_BE == dst_order)))
505
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
506
0
            if (src_size != 1 && src_size != 2 && src_size != 4 && src_size != 8 && src_size != 16)
507
0
                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
508
0
            switch (src->shared->type) {
509
0
                case H5T_INTEGER:
510
0
                case H5T_BITFIELD:
511
0
                case H5T_REFERENCE:
512
                    /* nothing to check */
513
0
                    break;
514
515
0
                case H5T_FLOAT:
516
0
                    if (src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
517
0
                        src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
518
0
                        src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
519
0
                        src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
520
0
                        src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
521
0
                        src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
522
0
                        src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
523
0
                        src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad)
524
0
                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
525
0
                    break;
526
527
0
                case H5T_NO_CLASS:
528
0
                case H5T_TIME:
529
0
                case H5T_STRING:
530
0
                case H5T_OPAQUE:
531
0
                case H5T_COMPOUND:
532
0
                case H5T_ENUM:
533
0
                case H5T_VLEN:
534
0
                case H5T_ARRAY:
535
                /* Complex numbers require some special-case logic for
536
                 * proper handling. Defer to H5T__conv_order for these types.
537
                 */
538
0
                case H5T_COMPLEX:
539
0
                case H5T_NCLASSES:
540
0
                default:
541
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported");
542
0
            }
543
0
            cdata->need_bkg = H5T_BKG_NO;
544
0
            break;
545
546
0
        case H5T_CONV_CONV:
547
            /* The conversion */
548
0
            if (NULL == src || NULL == dst)
549
0
                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype");
550
551
            /* Check for "no op" reference conversion */
552
0
            if (src->shared->type == H5T_REFERENCE) {
553
                /* Sanity check */
554
0
                if (dst->shared->type != H5T_REFERENCE)
555
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_REFERENCE datatype");
556
557
                /* Check if we are on a little-endian machine (the order that
558
                 * the addresses in the file must be) and just get out now, there
559
                 * is no need to convert the object reference.  Yes, this is
560
                 * icky and non-portable, but I can't think of a better way to
561
                 * support allowing the objno in the H5O_info_t struct and the
562
                 * hobj_ref_t type to be compared directly without introducing a
563
                 * "native" hobj_ref_t datatype and I think that would break a
564
                 * lot of existing programs.  -QAK
565
                 */
566
0
                if (H5T_native_order_g == H5T_ORDER_LE)
567
0
                    break;
568
0
            } /* end if */
569
570
0
            buf_stride = buf_stride ? buf_stride : src->shared->size;
571
0
            switch (src->shared->size) {
572
0
                case 1:
573
                    /*no-op*/
574
0
                    break;
575
576
0
                case 2:
577
0
                    for (/*void*/; nelmts >= 20; nelmts -= 20) {
578
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  0 */
579
0
                        buf += buf_stride;
580
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  1 */
581
0
                        buf += buf_stride;
582
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  2 */
583
0
                        buf += buf_stride;
584
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  3 */
585
0
                        buf += buf_stride;
586
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  4 */
587
0
                        buf += buf_stride;
588
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  5 */
589
0
                        buf += buf_stride;
590
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  6 */
591
0
                        buf += buf_stride;
592
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  7 */
593
0
                        buf += buf_stride;
594
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  8 */
595
0
                        buf += buf_stride;
596
0
                        H5_SWAP_BYTES(buf, 0, 1); /*  9 */
597
0
                        buf += buf_stride;
598
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 10 */
599
0
                        buf += buf_stride;
600
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 11 */
601
0
                        buf += buf_stride;
602
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 12 */
603
0
                        buf += buf_stride;
604
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 13 */
605
0
                        buf += buf_stride;
606
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 14 */
607
0
                        buf += buf_stride;
608
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 15 */
609
0
                        buf += buf_stride;
610
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 16 */
611
0
                        buf += buf_stride;
612
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 17 */
613
0
                        buf += buf_stride;
614
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 18 */
615
0
                        buf += buf_stride;
616
0
                        H5_SWAP_BYTES(buf, 0, 1); /* 19 */
617
0
                        buf += buf_stride;
618
0
                    } /* end for */
619
0
                    for (i = 0; i < nelmts; i++, buf += buf_stride)
620
0
                        H5_SWAP_BYTES(buf, 0, 1);
621
0
                    break;
622
623
0
                case 4:
624
0
                    for (/*void*/; nelmts >= 20; nelmts -= 20) {
625
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  0 */
626
0
                        H5_SWAP_BYTES(buf, 1, 2);
627
0
                        buf += buf_stride;
628
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  1 */
629
0
                        H5_SWAP_BYTES(buf, 1, 2);
630
0
                        buf += buf_stride;
631
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  2 */
632
0
                        H5_SWAP_BYTES(buf, 1, 2);
633
0
                        buf += buf_stride;
634
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  3 */
635
0
                        H5_SWAP_BYTES(buf, 1, 2);
636
0
                        buf += buf_stride;
637
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  4 */
638
0
                        H5_SWAP_BYTES(buf, 1, 2);
639
0
                        buf += buf_stride;
640
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  5 */
641
0
                        H5_SWAP_BYTES(buf, 1, 2);
642
0
                        buf += buf_stride;
643
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  6 */
644
0
                        H5_SWAP_BYTES(buf, 1, 2);
645
0
                        buf += buf_stride;
646
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  7 */
647
0
                        H5_SWAP_BYTES(buf, 1, 2);
648
0
                        buf += buf_stride;
649
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  8 */
650
0
                        H5_SWAP_BYTES(buf, 1, 2);
651
0
                        buf += buf_stride;
652
0
                        H5_SWAP_BYTES(buf, 0, 3); /*  9 */
653
0
                        H5_SWAP_BYTES(buf, 1, 2);
654
0
                        buf += buf_stride;
655
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 10 */
656
0
                        H5_SWAP_BYTES(buf, 1, 2);
657
0
                        buf += buf_stride;
658
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 11 */
659
0
                        H5_SWAP_BYTES(buf, 1, 2);
660
0
                        buf += buf_stride;
661
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 12 */
662
0
                        H5_SWAP_BYTES(buf, 1, 2);
663
0
                        buf += buf_stride;
664
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 13 */
665
0
                        H5_SWAP_BYTES(buf, 1, 2);
666
0
                        buf += buf_stride;
667
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 14 */
668
0
                        H5_SWAP_BYTES(buf, 1, 2);
669
0
                        buf += buf_stride;
670
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 15 */
671
0
                        H5_SWAP_BYTES(buf, 1, 2);
672
0
                        buf += buf_stride;
673
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 16 */
674
0
                        H5_SWAP_BYTES(buf, 1, 2);
675
0
                        buf += buf_stride;
676
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 17 */
677
0
                        H5_SWAP_BYTES(buf, 1, 2);
678
0
                        buf += buf_stride;
679
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 18 */
680
0
                        H5_SWAP_BYTES(buf, 1, 2);
681
0
                        buf += buf_stride;
682
0
                        H5_SWAP_BYTES(buf, 0, 3); /* 19 */
683
0
                        H5_SWAP_BYTES(buf, 1, 2);
684
0
                        buf += buf_stride;
685
0
                    } /* end for */
686
0
                    for (i = 0; i < nelmts; i++, buf += buf_stride) {
687
0
                        H5_SWAP_BYTES(buf, 0, 3);
688
0
                        H5_SWAP_BYTES(buf, 1, 2);
689
0
                    } /* end for */
690
0
                    break;
691
692
0
                case 8:
693
0
                    for (/*void*/; nelmts >= 10; nelmts -= 10) {
694
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  0 */
695
0
                        H5_SWAP_BYTES(buf, 1, 6);
696
0
                        H5_SWAP_BYTES(buf, 2, 5);
697
0
                        H5_SWAP_BYTES(buf, 3, 4);
698
0
                        buf += buf_stride;
699
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  1 */
700
0
                        H5_SWAP_BYTES(buf, 1, 6);
701
0
                        H5_SWAP_BYTES(buf, 2, 5);
702
0
                        H5_SWAP_BYTES(buf, 3, 4);
703
0
                        buf += buf_stride;
704
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  2 */
705
0
                        H5_SWAP_BYTES(buf, 1, 6);
706
0
                        H5_SWAP_BYTES(buf, 2, 5);
707
0
                        H5_SWAP_BYTES(buf, 3, 4);
708
0
                        buf += buf_stride;
709
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  3 */
710
0
                        H5_SWAP_BYTES(buf, 1, 6);
711
0
                        H5_SWAP_BYTES(buf, 2, 5);
712
0
                        H5_SWAP_BYTES(buf, 3, 4);
713
0
                        buf += buf_stride;
714
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  4 */
715
0
                        H5_SWAP_BYTES(buf, 1, 6);
716
0
                        H5_SWAP_BYTES(buf, 2, 5);
717
0
                        H5_SWAP_BYTES(buf, 3, 4);
718
0
                        buf += buf_stride;
719
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  5 */
720
0
                        H5_SWAP_BYTES(buf, 1, 6);
721
0
                        H5_SWAP_BYTES(buf, 2, 5);
722
0
                        H5_SWAP_BYTES(buf, 3, 4);
723
0
                        buf += buf_stride;
724
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  6 */
725
0
                        H5_SWAP_BYTES(buf, 1, 6);
726
0
                        H5_SWAP_BYTES(buf, 2, 5);
727
0
                        H5_SWAP_BYTES(buf, 3, 4);
728
0
                        buf += buf_stride;
729
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  7 */
730
0
                        H5_SWAP_BYTES(buf, 1, 6);
731
0
                        H5_SWAP_BYTES(buf, 2, 5);
732
0
                        H5_SWAP_BYTES(buf, 3, 4);
733
0
                        buf += buf_stride;
734
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  8 */
735
0
                        H5_SWAP_BYTES(buf, 1, 6);
736
0
                        H5_SWAP_BYTES(buf, 2, 5);
737
0
                        H5_SWAP_BYTES(buf, 3, 4);
738
0
                        buf += buf_stride;
739
0
                        H5_SWAP_BYTES(buf, 0, 7); /*  9 */
740
0
                        H5_SWAP_BYTES(buf, 1, 6);
741
0
                        H5_SWAP_BYTES(buf, 2, 5);
742
0
                        H5_SWAP_BYTES(buf, 3, 4);
743
0
                        buf += buf_stride;
744
0
                    } /* end for */
745
0
                    for (i = 0; i < nelmts; i++, buf += buf_stride) {
746
0
                        H5_SWAP_BYTES(buf, 0, 7);
747
0
                        H5_SWAP_BYTES(buf, 1, 6);
748
0
                        H5_SWAP_BYTES(buf, 2, 5);
749
0
                        H5_SWAP_BYTES(buf, 3, 4);
750
0
                    } /* end for */
751
0
                    break;
752
753
0
                case 16:
754
0
                    for (/*void*/; nelmts >= 10; nelmts -= 10) {
755
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  0 */
756
0
                        H5_SWAP_BYTES(buf, 1, 14);
757
0
                        H5_SWAP_BYTES(buf, 2, 13);
758
0
                        H5_SWAP_BYTES(buf, 3, 12);
759
0
                        H5_SWAP_BYTES(buf, 4, 11);
760
0
                        H5_SWAP_BYTES(buf, 5, 10);
761
0
                        H5_SWAP_BYTES(buf, 6, 9);
762
0
                        H5_SWAP_BYTES(buf, 7, 8);
763
0
                        buf += buf_stride;
764
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  1 */
765
0
                        H5_SWAP_BYTES(buf, 1, 14);
766
0
                        H5_SWAP_BYTES(buf, 2, 13);
767
0
                        H5_SWAP_BYTES(buf, 3, 12);
768
0
                        H5_SWAP_BYTES(buf, 4, 11);
769
0
                        H5_SWAP_BYTES(buf, 5, 10);
770
0
                        H5_SWAP_BYTES(buf, 6, 9);
771
0
                        H5_SWAP_BYTES(buf, 7, 8);
772
0
                        buf += buf_stride;
773
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  2 */
774
0
                        H5_SWAP_BYTES(buf, 1, 14);
775
0
                        H5_SWAP_BYTES(buf, 2, 13);
776
0
                        H5_SWAP_BYTES(buf, 3, 12);
777
0
                        H5_SWAP_BYTES(buf, 4, 11);
778
0
                        H5_SWAP_BYTES(buf, 5, 10);
779
0
                        H5_SWAP_BYTES(buf, 6, 9);
780
0
                        H5_SWAP_BYTES(buf, 7, 8);
781
0
                        buf += buf_stride;
782
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  3 */
783
0
                        H5_SWAP_BYTES(buf, 1, 14);
784
0
                        H5_SWAP_BYTES(buf, 2, 13);
785
0
                        H5_SWAP_BYTES(buf, 3, 12);
786
0
                        H5_SWAP_BYTES(buf, 4, 11);
787
0
                        H5_SWAP_BYTES(buf, 5, 10);
788
0
                        H5_SWAP_BYTES(buf, 6, 9);
789
0
                        H5_SWAP_BYTES(buf, 7, 8);
790
0
                        buf += buf_stride;
791
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  4 */
792
0
                        H5_SWAP_BYTES(buf, 1, 14);
793
0
                        H5_SWAP_BYTES(buf, 2, 13);
794
0
                        H5_SWAP_BYTES(buf, 3, 12);
795
0
                        H5_SWAP_BYTES(buf, 4, 11);
796
0
                        H5_SWAP_BYTES(buf, 5, 10);
797
0
                        H5_SWAP_BYTES(buf, 6, 9);
798
0
                        H5_SWAP_BYTES(buf, 7, 8);
799
0
                        buf += buf_stride;
800
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  5 */
801
0
                        H5_SWAP_BYTES(buf, 1, 14);
802
0
                        H5_SWAP_BYTES(buf, 2, 13);
803
0
                        H5_SWAP_BYTES(buf, 3, 12);
804
0
                        H5_SWAP_BYTES(buf, 4, 11);
805
0
                        H5_SWAP_BYTES(buf, 5, 10);
806
0
                        H5_SWAP_BYTES(buf, 6, 9);
807
0
                        H5_SWAP_BYTES(buf, 7, 8);
808
0
                        buf += buf_stride;
809
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  6 */
810
0
                        H5_SWAP_BYTES(buf, 1, 14);
811
0
                        H5_SWAP_BYTES(buf, 2, 13);
812
0
                        H5_SWAP_BYTES(buf, 3, 12);
813
0
                        H5_SWAP_BYTES(buf, 4, 11);
814
0
                        H5_SWAP_BYTES(buf, 5, 10);
815
0
                        H5_SWAP_BYTES(buf, 6, 9);
816
0
                        H5_SWAP_BYTES(buf, 7, 8);
817
0
                        buf += buf_stride;
818
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  7 */
819
0
                        H5_SWAP_BYTES(buf, 1, 14);
820
0
                        H5_SWAP_BYTES(buf, 2, 13);
821
0
                        H5_SWAP_BYTES(buf, 3, 12);
822
0
                        H5_SWAP_BYTES(buf, 4, 11);
823
0
                        H5_SWAP_BYTES(buf, 5, 10);
824
0
                        H5_SWAP_BYTES(buf, 6, 9);
825
0
                        H5_SWAP_BYTES(buf, 7, 8);
826
0
                        buf += buf_stride;
827
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  8 */
828
0
                        H5_SWAP_BYTES(buf, 1, 14);
829
0
                        H5_SWAP_BYTES(buf, 2, 13);
830
0
                        H5_SWAP_BYTES(buf, 3, 12);
831
0
                        H5_SWAP_BYTES(buf, 4, 11);
832
0
                        H5_SWAP_BYTES(buf, 5, 10);
833
0
                        H5_SWAP_BYTES(buf, 6, 9);
834
0
                        H5_SWAP_BYTES(buf, 7, 8);
835
0
                        buf += buf_stride;
836
0
                        H5_SWAP_BYTES(buf, 0, 15); /*  9 */
837
0
                        H5_SWAP_BYTES(buf, 1, 14);
838
0
                        H5_SWAP_BYTES(buf, 2, 13);
839
0
                        H5_SWAP_BYTES(buf, 3, 12);
840
0
                        H5_SWAP_BYTES(buf, 4, 11);
841
0
                        H5_SWAP_BYTES(buf, 5, 10);
842
0
                        H5_SWAP_BYTES(buf, 6, 9);
843
0
                        H5_SWAP_BYTES(buf, 7, 8);
844
0
                        buf += buf_stride;
845
0
                    } /* end for */
846
0
                    for (i = 0; i < nelmts; i++, buf += buf_stride) {
847
0
                        H5_SWAP_BYTES(buf, 0, 15);
848
0
                        H5_SWAP_BYTES(buf, 1, 14);
849
0
                        H5_SWAP_BYTES(buf, 2, 13);
850
0
                        H5_SWAP_BYTES(buf, 3, 12);
851
0
                        H5_SWAP_BYTES(buf, 4, 11);
852
0
                        H5_SWAP_BYTES(buf, 5, 10);
853
0
                        H5_SWAP_BYTES(buf, 6, 9);
854
0
                        H5_SWAP_BYTES(buf, 7, 8);
855
0
                    } /* end for */
856
0
                    break;
857
858
0
                default:
859
0
                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "invalid conversion size");
860
0
            } /* end switch */
861
0
            break;
862
863
0
        case H5T_CONV_FREE:
864
            /* Free private data */
865
0
            break;
866
867
0
        default:
868
0
            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command");
869
0
    } /* end switch */
870
871
0
done:
872
0
    FUNC_LEAVE_NOAPI(ret_value)
873
0
} /* end H5T__conv_order_opt() */