#
# Copyright 2015 ClusterHQ
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

"""
Python bindings for ``libnvpair``.
"""
from __future__ import absolute_import, division, print_function

CDEF = """
    typedef ... nvlist_t;
    typedef ... nvpair_t;


    typedef enum {
        DATA_TYPE_UNKNOWN = 0,
        DATA_TYPE_BOOLEAN,
        DATA_TYPE_BYTE,
        DATA_TYPE_INT16,
        DATA_TYPE_UINT16,
        DATA_TYPE_INT32,
        DATA_TYPE_UINT32,
        DATA_TYPE_INT64,
        DATA_TYPE_UINT64,
        DATA_TYPE_STRING,
        DATA_TYPE_BYTE_ARRAY,
        DATA_TYPE_INT16_ARRAY,
        DATA_TYPE_UINT16_ARRAY,
        DATA_TYPE_INT32_ARRAY,
        DATA_TYPE_UINT32_ARRAY,
        DATA_TYPE_INT64_ARRAY,
        DATA_TYPE_UINT64_ARRAY,
        DATA_TYPE_STRING_ARRAY,
        DATA_TYPE_HRTIME,
        DATA_TYPE_NVLIST,
        DATA_TYPE_NVLIST_ARRAY,
        DATA_TYPE_BOOLEAN_VALUE,
        DATA_TYPE_INT8,
        DATA_TYPE_UINT8,
        DATA_TYPE_BOOLEAN_ARRAY,
        DATA_TYPE_INT8_ARRAY,
        DATA_TYPE_UINT8_ARRAY
    } data_type_t;
    typedef enum { B_FALSE, B_TRUE } boolean_t;

    typedef unsigned char uchar_t;
    typedef unsigned int uint_t;

    int nvlist_alloc(nvlist_t **, uint_t, int);
    void nvlist_free(nvlist_t *);

    int nvlist_unpack(char *, size_t, nvlist_t **, int);

    void dump_nvlist(nvlist_t *, int);
    int nvlist_dup(nvlist_t *, nvlist_t **, int);

    int nvlist_add_boolean(nvlist_t *, const char *);
    int nvlist_add_boolean_value(nvlist_t *, const char *, boolean_t);
    int nvlist_add_byte(nvlist_t *, const char *, uchar_t);
    int nvlist_add_int8(nvlist_t *, const char *, int8_t);
    int nvlist_add_uint8(nvlist_t *, const char *, uint8_t);
    int nvlist_add_int16(nvlist_t *, const char *, int16_t);
    int nvlist_add_uint16(nvlist_t *, const char *, uint16_t);
    int nvlist_add_int32(nvlist_t *, const char *, int32_t);
    int nvlist_add_uint32(nvlist_t *, const char *, uint32_t);
    int nvlist_add_int64(nvlist_t *, const char *, int64_t);
    int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
    int nvlist_add_string(nvlist_t *, const char *, const char *);
    int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
    int nvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *,
        uint_t);
    int nvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t);
    int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t);
    int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t);
    int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t);
    int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t);
    int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t);
    int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t);
    int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t);
    int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
    int nvlist_add_string_array(nvlist_t *, const char *, char *const *,
        uint_t);
    int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);

    nvpair_t *nvlist_next_nvpair(nvlist_t *, nvpair_t *);
    nvpair_t *nvlist_prev_nvpair(nvlist_t *, nvpair_t *);
    char *nvpair_name(nvpair_t *);
    data_type_t nvpair_type(nvpair_t *);
    int nvpair_type_is_array(nvpair_t *);
    int nvpair_value_boolean_value(nvpair_t *, boolean_t *);
    int nvpair_value_byte(nvpair_t *, uchar_t *);
    int nvpair_value_int8(nvpair_t *, int8_t *);
    int nvpair_value_uint8(nvpair_t *, uint8_t *);
    int nvpair_value_int16(nvpair_t *, int16_t *);
    int nvpair_value_uint16(nvpair_t *, uint16_t *);
    int nvpair_value_int32(nvpair_t *, int32_t *);
    int nvpair_value_uint32(nvpair_t *, uint32_t *);
    int nvpair_value_int64(nvpair_t *, int64_t *);
    int nvpair_value_uint64(nvpair_t *, uint64_t *);
    int nvpair_value_string(nvpair_t *, char **);
    int nvpair_value_nvlist(nvpair_t *, nvlist_t **);
    int nvpair_value_boolean_array(nvpair_t *, boolean_t **, uint_t *);
    int nvpair_value_byte_array(nvpair_t *, uchar_t **, uint_t *);
    int nvpair_value_int8_array(nvpair_t *, int8_t **, uint_t *);
    int nvpair_value_uint8_array(nvpair_t *, uint8_t **, uint_t *);
    int nvpair_value_int16_array(nvpair_t *, int16_t **, uint_t *);
    int nvpair_value_uint16_array(nvpair_t *, uint16_t **, uint_t *);
    int nvpair_value_int32_array(nvpair_t *, int32_t **, uint_t *);
    int nvpair_value_uint32_array(nvpair_t *, uint32_t **, uint_t *);
    int nvpair_value_int64_array(nvpair_t *, int64_t **, uint_t *);
    int nvpair_value_uint64_array(nvpair_t *, uint64_t **, uint_t *);
    int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
    int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
"""

SOURCE = """
#include <libzfs/sys/nvpair.h>
"""

LIBRARY = "nvpair"

# vim: softtabstop=4 tabstop=4 expandtab shiftwidth=4
