blob: b66511d498364accf8cad502ddccb6b6719bc4ef [file] [log] [blame]
Radek Krejcie7b95092019-05-15 11:03:07 +02001/**
2 * @file printer_data.c
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief Generic data printers functions.
5 *
6 * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
Radek Krejci535ea9f2020-05-29 16:01:05 +020015#include "printer_data.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020016
Radek Krejcie7b95092019-05-15 11:03:07 +020017#include <stdio.h>
Radek Krejcie7b95092019-05-15 11:03:07 +020018
Radek Krejci535ea9f2020-05-29 16:01:05 +020019#include "common.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020020#include "log.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020021#include "out.h"
22#include "out_internal.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020023#include "printer_internal.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020024#include "tree_data.h"
Michal Vaskoc8a230d2020-08-14 12:17:10 +020025#include "tree_schema.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020026
Michal Vasko3a41dff2020-07-15 14:30:28 +020027static LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +020028lyd_print_(struct ly_out *out, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejcie7b95092019-05-15 11:03:07 +020029{
Michal Vasko3a41dff2020-07-15 14:30:28 +020030 LY_ERR ret = LY_SUCCESS;
Radek Krejcie7b95092019-05-15 11:03:07 +020031
32 switch (format) {
33 case LYD_XML:
34 ret = xml_print_data(out, root, options);
35 break;
Radek Krejcie7b95092019-05-15 11:03:07 +020036 case LYD_JSON:
37 ret = json_print_data(out, root, options);
38 break;
39 case LYD_LYB:
40 ret = lyb_print_data(out, root, options);
41 break;
Michal Vaskoc8a230d2020-08-14 12:17:10 +020042 case LYD_UNKNOWN:
Michal Vaskob7be7a82020-08-20 09:09:04 +020043 LOGINT(root ? LYD_CTX(root) : NULL);
Michal Vaskoc8a230d2020-08-14 12:17:10 +020044 ret = LY_EINT;
Radek Krejcie7b95092019-05-15 11:03:07 +020045 break;
46 }
47
Michal Vasko63f3d842020-07-08 10:10:14 +020048 return ret;
Radek Krejcie7b95092019-05-15 11:03:07 +020049}
Radek Krejci26da5222020-06-09 17:43:17 +020050
Michal Vasko3a41dff2020-07-15 14:30:28 +020051API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +020052lyd_print_all(struct ly_out *out, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +020053{
Michal Vasko3f5fa762020-08-11 13:44:07 +020054 LY_CHECK_ARG_RET(NULL, out, !(options & LYD_PRINT_WITHSIBLINGS), LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +020055
Michal Vasko3a41dff2020-07-15 14:30:28 +020056 /* reset the number of printed bytes */
57 out->func_printed = 0;
Radek Krejci26da5222020-06-09 17:43:17 +020058
Radek Krejci2e874772020-08-28 16:36:33 +020059 if (root) {
60 /* get first top-level sibling */
61 while (root->parent) {
Michal Vasko9e685082021-01-29 14:49:09 +010062 root = lyd_parent(root);
Radek Krejci2e874772020-08-28 16:36:33 +020063 }
64 while (root->prev->next) {
65 root = root->prev;
66 }
Michal Vasko3a41dff2020-07-15 14:30:28 +020067 }
Radek Krejci26da5222020-06-09 17:43:17 +020068
Michal Vasko3a41dff2020-07-15 14:30:28 +020069 /* print each top-level sibling */
70 LY_CHECK_RET(lyd_print_(out, root, format, options | LYD_PRINT_WITHSIBLINGS));
71
72 return LY_SUCCESS;
73}
74
75API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +020076lyd_print_tree(struct ly_out *out, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Michal Vasko3a41dff2020-07-15 14:30:28 +020077{
Michal Vasko3f5fa762020-08-11 13:44:07 +020078 LY_CHECK_ARG_RET(NULL, out, !(options & LYD_PRINT_WITHSIBLINGS), LY_EINVAL);
Michal Vasko3a41dff2020-07-15 14:30:28 +020079
80 /* reset the number of printed bytes */
81 out->func_printed = 0;
82
83 /* print the subtree */
84 LY_CHECK_RET(lyd_print_(out, root, format, options));
85
86 return LY_SUCCESS;
Radek Krejci26da5222020-06-09 17:43:17 +020087}
88
89API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +020090lyd_print_mem(char **strp, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +020091{
Michal Vasko3a41dff2020-07-15 14:30:28 +020092 LY_ERR ret;
Radek Krejci26da5222020-06-09 17:43:17 +020093 struct ly_out *out;
94
Michal Vasko3f5fa762020-08-11 13:44:07 +020095 LY_CHECK_ARG_RET(NULL, strp, LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +020096
97 /* init */
98 *strp = NULL;
99
Radek Krejci84ce7b12020-06-11 17:28:25 +0200100 LY_CHECK_RET(ly_out_new_memory(strp, 0, &out));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200101 ret = lyd_print_(out, root, format, options);
102 ly_out_free(out, NULL, 0);
103 return ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200104}
105
106API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +0200107lyd_print_fd(int fd, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +0200108{
Michal Vasko3a41dff2020-07-15 14:30:28 +0200109 LY_ERR ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200110 struct ly_out *out;
111
Michal Vasko3f5fa762020-08-11 13:44:07 +0200112 LY_CHECK_ARG_RET(NULL, fd != -1, LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +0200113
Radek Krejci84ce7b12020-06-11 17:28:25 +0200114 LY_CHECK_RET(ly_out_new_fd(fd, &out));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200115 ret = lyd_print_(out, root, format, options);
116 ly_out_free(out, NULL, 0);
117 return ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200118}
119
120API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +0200121lyd_print_file(FILE *f, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +0200122{
Michal Vasko3a41dff2020-07-15 14:30:28 +0200123 LY_ERR ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200124 struct ly_out *out;
125
Michal Vasko3f5fa762020-08-11 13:44:07 +0200126 LY_CHECK_ARG_RET(NULL, f, LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +0200127
Radek Krejci84ce7b12020-06-11 17:28:25 +0200128 LY_CHECK_RET(ly_out_new_file(f, &out));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200129 ret = lyd_print_(out, root, format, options);
130 ly_out_free(out, NULL, 0);
131 return ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200132}
133
134API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +0200135lyd_print_path(const char *path, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +0200136{
Michal Vasko3a41dff2020-07-15 14:30:28 +0200137 LY_ERR ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200138 struct ly_out *out;
139
Michal Vasko3f5fa762020-08-11 13:44:07 +0200140 LY_CHECK_ARG_RET(NULL, path, LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +0200141
Radek Krejci84ce7b12020-06-11 17:28:25 +0200142 LY_CHECK_RET(ly_out_new_filepath(path, &out));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200143 ret = lyd_print_(out, root, format, options);
144 ly_out_free(out, NULL, 0);
145 return ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200146}
147
148API LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +0200149lyd_print_clb(ly_write_clb writeclb, void *user_data, const struct lyd_node *root, LYD_FORMAT format, uint32_t options)
Radek Krejci26da5222020-06-09 17:43:17 +0200150{
Michal Vasko3a41dff2020-07-15 14:30:28 +0200151 LY_ERR ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200152 struct ly_out *out;
153
Michal Vasko3f5fa762020-08-11 13:44:07 +0200154 LY_CHECK_ARG_RET(NULL, writeclb, LY_EINVAL);
Radek Krejci26da5222020-06-09 17:43:17 +0200155
Michal Vaskoce2b8742020-08-24 13:20:25 +0200156 LY_CHECK_RET(ly_out_new_clb(writeclb, user_data, &out));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200157 ret = lyd_print_(out, root, format, options);
158 ly_out_free(out, NULL, 0);
159 return ret;
Radek Krejci26da5222020-06-09 17:43:17 +0200160}