summaryrefslogtreecommitdiffstats
path: root/test/dynlib4.c
blob: 316962a5d79879ece6122ead21902ff341779aae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5. The full HDF5 copyright notice, including      *
 * terms governing use, modification, and redistribution, is contained in    *
 * the files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic document set and is     *
 * linked from the top-level documents page.  It can also be found at        *
 * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access   *
 * to either file, you may request a copy from help@hdfgroup.org.            *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
 * Purpose:    Tests the plugin module (H5PL)
 */

#include <stdlib.h>
#include <stdio.h>
#include "H5PLextern.h"

#define H5Z_FILTER_DYNLIB4      260

#define PUSH_ERR(func, minor, str) H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, H5E_ERR_CLS, H5E_PLUGIN, minor, str)

static size_t H5Z_filter_dynlib4(unsigned int flags, size_t cd_nelmts,
                const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
herr_t H5Z_filter_can_apply(hid_t dcpl, hid_t type, hid_t space);
herr_t H5Z_filter_set_local(hid_t dcpl, hid_t type, hid_t space);

/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIB4[1] = {{
    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
    H5Z_FILTER_DYNLIB4,             /* Filter id number        */
    1, 1,                            /* Encoding and decoding enabled   */
    "dynlib4",                 /* Filter name for debugging    */
    (H5Z_can_apply_func_t)(H5Z_filter_can_apply),                            /* The "can apply" callback        */
    (H5Z_set_local_func_t)(H5Z_filter_set_local),                            /* The "set local" callback        */
    (H5Z_func_t)H5Z_filter_dynlib4,    /* The actual filter function    */
}};

H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
const void    *H5PLget_plugin_info(void) {return H5Z_DYNLIB4;}

herr_t H5Z_filter_can_apply(hid_t dcpl, hid_t type, hid_t space) {
    H5I_type_t dcpl_type;

    dcpl_type = H5Iget_type(dcpl);
    if (dcpl_type < 0) {
        PUSH_ERR("H5Z_filter_can_apply", H5E_CALLBACK, "dcpl not valid");
        return -1;
    }

    return 1;
}

herr_t H5Z_filter_set_local(hid_t dcpl, hid_t type, hid_t space) {
    herr_t r;
    unsigned int flags;
    size_t nelements = 4;
    unsigned int values[] = {0,0,0,0};

    r = H5Pget_filter_by_id2(dcpl, H5Z_FILTER_DYNLIB4, &flags, &nelements, values, 0, NULL, NULL);
    if (r < 0) {
        PUSH_ERR("H5Z_filter_set_local", H5E_CALLBACK, "dcpl fails get_filter_by_id2");
        return -1;
    }

    return 1;
}

/*-------------------------------------------------------------------------
 * Function:    H5Z_filter_dynlib4
 *
 * Purpose:    A dynlib4 filter method that adds on and subtract from
 *              the original value with another value.  It will be built
 *              as a shared library.  plugin.c test will load and use
 *              this filter library. Designed to call a HDF function.
 *
 * Return:    Success:    Data chunk size
 *
 *        Failure:    0
 *
 *-------------------------------------------------------------------------
 */
static size_t
H5Z_filter_dynlib4(unsigned int flags, size_t cd_nelmts,
      const unsigned int *cd_values, size_t nbytes,
      size_t *buf_size, void **buf)
{
    int *int_ptr = (int *)*buf;          /* Pointer to the data values */
    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
    int add_on = 0;
    unsigned ver_info[3];

    /* Check for the library version */
    if(H5get_libversion(&ver_info[0], &ver_info[1], &ver_info[2]) < 0) {
        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion");
        return(0);
    }
    /* Check for the correct number of parameters */
    if(cd_nelmts == 0)
        return(0);

    /* Check that permanent parameters are set correctly */
    if(cd_values[0] > 9)
        return(0);

    if(ver_info[0] != cd_values[1] || ver_info[1] != cd_values[2]) {
        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion does not match");
        return(0);
    }

    add_on = (int)cd_values[0];

    if(flags & H5Z_FLAG_REVERSE) { /*read*/
        /* Substract the "add on" value to all the data values */
        while(buf_left > 0) {
            *int_ptr++ -= add_on;
            buf_left -= sizeof(int);
        } /* end while */
    } /* end if */
    else { /*write*/
        /* Add the "add on" value to all the data values */
        while(buf_left > 0) {
            *int_ptr++ += add_on;
            buf_left -= sizeof(int);
        } /* end while */
    } /* end else */

    return nbytes;
} /* end H5Z_filter_dynlib4() */