| // 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; |