blob: 13f31638df6da1898494effef8c1a8ddebd258ac [file] [log] [blame]
Radek Krejci5aeea3a2018-09-05 13:29:36 +02001/**
2 * @file libyang.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
Michal Vaskob4750962022-10-06 15:33:35 +02004 * @author Michal Vasko <mvasko@cesnet.cz>
Radek Krejci5aeea3a2018-09-05 13:29:36 +02005 * @brief The main libyang public header.
6 *
Michal Vaskob1319892024-02-26 16:15:40 +01007 * Copyright (c) 2015 - 2024 CESNET, z.s.p.o.
Radek Krejci5aeea3a2018-09-05 13:29:36 +02008 *
9 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * https://opensource.org/licenses/BSD-3-Clause
14 */
15
16#ifndef LY_LIBYANG_H_
17#define LY_LIBYANG_H_
18
Radek Krejci0af5f5d2018-09-07 15:00:30 +020019#include <stdint.h>
20
Radek Krejci5aeea3a2018-09-05 13:29:36 +020021#ifdef __cplusplus
22extern "C" {
23#endif
24
Radek Krejcica376bd2020-06-11 16:04:06 +020025#include "context.h"
26#include "dict.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020027#include "in.h"
Radek Krejci47fab892020-11-05 17:02:41 +010028#include "log.h"
Michal Vasko5c00c072022-11-08 12:22:19 +010029#include "metadata.h"
Radek Krejci47fab892020-11-05 17:02:41 +010030#include "out.h"
Radek Krejci7931b192020-06-25 17:05:03 +020031#include "parser_data.h"
Radek Krejcif0e1ba52020-05-22 15:14:35 +020032#include "parser_schema.h"
Radek Krejcif0e1ba52020-05-22 15:14:35 +020033#include "printer_data.h"
34#include "printer_schema.h"
Radek Krejci6caa6ab2018-10-24 10:04:48 +020035#include "set.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020036#include "tree.h"
37#include "tree_data.h"
Radek Krejci6caa6ab2018-10-24 10:04:48 +020038#include "tree_schema.h"
39
Michal Vaskoed277582024-03-28 09:55:31 +010040/**
41 * @brief libyang v3 compatibility macros with v2.
42 */
43#define ly_strerrcode ly_strerr
44#define ly_last_errmsg ly_last_logmsg
45#define ly_errcode(ctx) (ly_err_last(ctx) ? ly_err_last(ctx)->err : 0)
46#define ly_errmsg(ctx) (ly_err_last(ctx) ? ly_err_last(ctx)->msg : NULL)
47#define ly_errpath(ctx) (ly_err_last(ctx) ? (ly_err_last(ctx)->data_path ? ly_err_last(ctx)->data_path : ly_err_last(ctx)->schema_path) : NULL)
48#define ly_vecode(ctx) (ly_err_last(ctx) ? ly_err_last(ctx)->vecode : 0)
49
Radek Krejci47fab892020-11-05 17:02:41 +010050/*
51 * The following headers are supposed to be included explicitly:
Michal Vaskoae130f52023-04-20 14:25:16 +020052 * - hash_table.h
Michal Vaskob4750962022-10-06 15:33:35 +020053 * - metadata.h
Radek Krejci47fab892020-11-05 17:02:41 +010054 * - plugins_types.h
55 * - plugins_exts.h
56 */
57
Radek Krejci5aeea3a2018-09-05 13:29:36 +020058/**
Radek Krejcie53a8dc2018-10-17 12:52:40 +020059 * @mainpage About
60 *
61 * libyang is a library implementing processing of the YANG schemas and data modeled by the YANG language. The
62 * library is implemented in C for GNU/Linux and provides C API.
63 *
64 * @section about-features Main Features
65 *
Radek Krejci8678fa42020-08-18 16:07:28 +020066 * - [Parsing (and validating) schemas](@ref howtoSchema) in YANG format.
67 * - [Parsing (and validating) schemas](@ref howtoSchema) in YIN format.
68 * - [Parsing, validating and printing instance data](@ref howtoData) in XML format.
69 * - [Parsing, validating and printing instance data](@ref howtoData) in JSON format
Radek Krejcie53a8dc2018-10-17 12:52:40 +020070 * ([RFC 7951](https://tools.ietf.org/html/rfc7951)).
Radek Krejci8678fa42020-08-18 16:07:28 +020071 * - [Manipulation with the instance data](@ref howtoDataManipulation).
72 * - Support for [default values in the instance data](@ref howtoDataWD) ([RFC 6243](https://tools.ietf.org/html/rfc6243)).
73 * - Support for [YANG extensions and user types](@ref howtoPlugins).
Radek Krejci75104122021-04-01 15:37:45 +020074 * - Support for [YANG Metadata](@ref howtoDataMetadata) ([RFC 7952](https://tools.ietf.org/html/rfc6243)).
Michal Vasko1fd27412022-02-11 10:04:50 +010075 * - Support for [YANG Schema Mount](@ref howtoDataMountpoint) ([RFC 8528](https://tools.ietf.org/html/rfc8528)).
Radek Krejcie53a8dc2018-10-17 12:52:40 +020076 *
77 * The current implementation covers YANG 1.0 ([RFC 6020](https://tools.ietf.org/html/rfc6020)) as well as
78 * YANG 1.1 ([RFC 7950](https://tools.ietf.org/html/rfc7950)).
79 *
80 * @section about-license License
81 *
Michal Vaskob1319892024-02-26 16:15:40 +010082 * Copyright (c) 2015-2024 CESNET, z.s.p.o.
Radek Krejcie53a8dc2018-10-17 12:52:40 +020083 *
84 * (The BSD 3-Clause License)
85 *
86 * Redistribution and use in source and binary forms, with or without
87 * modification, are permitted provided that the following conditions
88 * are met:
89 * 1. Redistributions of source code must retain the above copyright
90 * notice, this list of conditions and the following disclaimer.
91 * 2. Redistributions in binary form must reproduce the above copyright
92 * notice, this list of conditions and the following disclaimer in
93 * the documentation and/or other materials provided with the
94 * distribution.
95 * 3. Neither the name of the Company nor the names of its contributors
96 * may be used to endorse or promote products derived from this
97 * software without specific prior written permission.
98 */
99
100/**
Radek Krejci52785a22019-09-11 12:57:26 +0200101 * @page howto libyang API Overview
Radek Krejcie53a8dc2018-10-17 12:52:40 +0200102 *
Radek Krejci8678fa42020-08-18 16:07:28 +0200103 * @section howtoGeneral General notes
104 *
105 * libyang is primarily intended for handling data modeled by YANG modeling language, so the library is supposed to be optimized
106 * for this purpose. However, as a side effect, the library has to be able precisely process YANG modules. Thus, it is usable by
107 * YANG module authors to validate their modules and schemas in the development process.
108 *
109 * - @subpage howtoStructures
110 * - @subpage howtoErrors
111 * - @subpage howtoLogger
112 * - @subpage howtoThreads
113 * - @subpage howtoContext
Michal Vaskoafac7822020-10-20 14:22:26 +0200114 * - @subpage howtoInput
115 * - @subpage howtoOutput
Radek Krejci8678fa42020-08-18 16:07:28 +0200116 * - @subpage howtoSchema
117 * - @subpage howtoData
118 * - @subpage howtoXPath
119 * - @subpage howtoPlugins
120 */
121
122/**
123 * @page howtoStructures Data Structures
124 *
125 * @section sizedarrays Sized Arrays
126 *
127 * The structure starts with 32bit number storing size of the array - the number of the items inside. The size is part of the
128 * array to have it allocated together with the array itself only when it is needed. However, the pointers to the array always
129 * points after the 32b number, so items can be accessed directly as for standard C arrays. Because of a known size (available
130 * via ::LY_ARRAY_COUNT macro), it is not terminated by any special byte (sequence), so there is also no limitation for specific
131 * content of the stored records (e.g. that first byte must not be NULL).
132 *
133 * The sized arrays must be carefully freed (which should be done anyway only internally), since pointers to the sized arrays used
134 * in libyang structures, does not point to the beginning of the allocated space.
135 *
136 * - ::LY_ARRAY_COUNT
137 * - ::LY_ARRAY_FOR
138 *
139 * @section struct_lists Lists
140 *
141 * The lists are structures connected via a `next` and `prev` pointers. Iterating over the siblings can be simply done by
142 * ::LY_LIST_FOR macro. Examples of such structures are ::lyd_node or ::lysc_node.
143 *
144 * The `prev` pointer is always filled. In case there is just a single item in the list, the `prev` pointer points to the
145 * item itself. Otherwise, the `prev` pointer of the first item points to the last item of the list. In contrast, the
146 * `next` pointer of the last item in the list is always NULL.
147 */
148
149/**
Michal Vasko5a5e7f82021-04-15 11:11:03 +0200150 * @page howtoThreads Threading Limitations
151 *
152 * @section context Context
153 *
154 * It is safe to read from ::ly_ctx structure concurrently and use its dictionary, which is protected by a lock.
155 * Thread-safe functions include any ones working with data trees (only context dictionary is accessed) and all
156 * the `ly_ctx_get_*()` functions. Generally, they are the functions with `const` context parameter.
157 *
158 * @section data Data Trees
159 *
160 * Data trees are not internally synchronized so the general safe practice of a single writer **or** several concurrent
161 * readers should be followed. Specifically, only the functions with non-const ::lyd_node parameters modify the node(s)
162 * and no concurrent execution of such functions should be allowed on a single data tree or subtrees of one.
163 */
164
165/**
Radek Krejci290a6a52019-09-12 17:13:17 +0200166 * @internal
167 * @page internals Developers' Notes
168 * @tableofcontents
169 *
170 * Following texts describes various internal subsystems and mechanism in libyang which are hidden from external users, but important
171 * for libyang developers. The texts should explain various decisions made and internal processes utilized in libyang.
172 */
173
Radek Krejci0af5f5d2018-09-07 15:00:30 +0200174#ifdef __cplusplus
175}
176#endif
Radek Krejci5aeea3a2018-09-05 13:29:36 +0200177
178#endif /* LY_LIBYANG_H_ */