blob: 9b992055da77688aa71a9b33ec43a25e44d80a61 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <stdbool.h>
#include <zircon/types.h>
#include <zircon/mdi.h>
__BEGIN_CDECLS;
typedef struct mdi_node_ref {
const mdi_node_t* node;
uint32_t siblings_count; // number of siblings following node in list
const void* siblings_end; // pointer to end of remaining siblings
} mdi_node_ref_t;
static inline bool mdi_valid(const mdi_node_ref_t* ref) {
return ref->node != NULL;
}
// takes pointer to MDI data and returns reference to MDI root node
zx_status_t mdi_init(const void* mdi_data, size_t length, mdi_node_ref_t* out_ref);
// returns the type of a node
static inline mdi_id_t mdi_id(const mdi_node_ref_t* ref) {
return ref->node->id;
}
// returns the type of a node
static inline mdi_type_t mdi_node_type(const mdi_node_ref_t* ref) {
return MDI_ID_TYPE(ref->node->id);
}
// node value accessors
zx_status_t mdi_node_uint8(const mdi_node_ref_t* ref, uint8_t* out_value);
zx_status_t mdi_node_int32(const mdi_node_ref_t* ref, int32_t* out_value);
zx_status_t mdi_node_uint32(const mdi_node_ref_t* ref, uint32_t* out_value);
zx_status_t mdi_node_uint64(const mdi_node_ref_t* ref, uint64_t* out_value);
zx_status_t mdi_node_boolean(const mdi_node_ref_t* ref, bool* out_value);
const char* mdi_node_string(const mdi_node_ref_t* ref);
// array element accessors
const void* mdi_array_values(const mdi_node_ref_t* ref);
uint32_t mdi_array_length(const mdi_node_ref_t* ref);
zx_status_t mdi_array_uint8(const mdi_node_ref_t* ref, uint8_t index, uint8_t* out_value);
zx_status_t mdi_array_int32(const mdi_node_ref_t* ref, uint32_t index, int32_t* out_value);
zx_status_t mdi_array_uint32(const mdi_node_ref_t* ref, uint32_t index, uint32_t* out_value);
zx_status_t mdi_array_uint64(const mdi_node_ref_t* ref, uint32_t index, uint64_t* out_value);
zx_status_t mdi_array_boolean(const mdi_node_ref_t* ref, uint32_t index, bool* out_value);
// list traversal
zx_status_t mdi_first_child(const mdi_node_ref_t* ref, mdi_node_ref_t* out_ref);
zx_status_t mdi_next_child(const mdi_node_ref_t* ref, mdi_node_ref_t* out_ref);
uint32_t mdi_child_count(const mdi_node_ref_t* ref);
zx_status_t mdi_find_node(const mdi_node_ref_t* ref, mdi_id_t id, mdi_node_ref_t* out_ref);
#define mdi_each_child(parent, child) \
for (mdi_first_child(parent, child); mdi_valid(child); mdi_next_child(child, child))
__END_CDECLS;