111 lines
4.3 KiB
C
111 lines
4.3 KiB
C
|
/**
|
||
|
* @file out_internal.h
|
||
|
* @author Radek Krejci <rkrejci@cesnet.cz>
|
||
|
* @brief Internal structures and functions for libyang
|
||
|
*
|
||
|
* Copyright (c) 2015-2020 CESNET, z.s.p.o.
|
||
|
*
|
||
|
* This source code is licensed under BSD 3-Clause License (the "License").
|
||
|
* You may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* https://opensource.org/licenses/BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#ifndef LY_OUT_INTERNAL_H_
|
||
|
#define LY_OUT_INTERNAL_H_
|
||
|
|
||
|
#include "out.h"
|
||
|
|
||
|
struct lyd_node;
|
||
|
|
||
|
/**
|
||
|
* @brief Printer output structure specifying where the data are printed.
|
||
|
*/
|
||
|
struct ly_out {
|
||
|
LY_OUT_TYPE type; /**< type of the output to select the output method */
|
||
|
|
||
|
union {
|
||
|
int fd; /**< file descriptor for LY_OUT_FD type */
|
||
|
FILE *f; /**< file structure for LY_OUT_FILE, LY_OUT_FDSTREAM and LY_OUT_FILEPATH types */
|
||
|
|
||
|
struct {
|
||
|
FILE *f; /**< file stream from the original file descriptor, variable is mapped to the LY_OUT_FILE's f */
|
||
|
int fd; /**< original file descriptor, which was not used directly because of missing vdprintf() */
|
||
|
} fdstream; /**< structure for LY_OUT_FDSTREAM type, which is LY_OUT_FD when vdprintf() is missing */
|
||
|
struct {
|
||
|
FILE *f; /**< file structure for LY_OUT_FILEPATH, variable is mapped to the LY_OUT_FILE's f */
|
||
|
char *filepath; /**< stored original filepath */
|
||
|
} fpath; /**< filepath structure for LY_OUT_FILEPATH */
|
||
|
struct {
|
||
|
char **buf; /**< storage for the pointer to the memory buffer to store the output */
|
||
|
size_t len; /**< number of used bytes in the buffer */
|
||
|
size_t size; /**< allocated size of the buffer */
|
||
|
} mem; /**< memory buffer information for LY_OUT_MEMORY type */
|
||
|
struct {
|
||
|
ssize_t (*func)(void *arg, const void *buf, size_t count); /**< callback function */
|
||
|
void *arg; /**< optional argument for the callback function */
|
||
|
} clb; /**< printer callback for LY_OUT_CALLBACK type */
|
||
|
} method; /**< type-specific information about the output */
|
||
|
|
||
|
/* LYB only */
|
||
|
char *buffered; /**< additional buffer for holes */
|
||
|
size_t buf_len; /**< number of used bytes in the additional buffer for holes */
|
||
|
size_t buf_size; /**< allocated size of the buffer for holes */
|
||
|
size_t hole_count; /**< hole counter */
|
||
|
|
||
|
size_t printed; /**< Total number of printed bytes */
|
||
|
size_t func_printed; /**< Number of bytes printed by the last function */
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Generic printer of the given format string into the specified output.
|
||
|
*
|
||
|
* Does not reset printed bytes. Adds to printed bytes.
|
||
|
*
|
||
|
* @param[in] out Output specification.
|
||
|
* @param[in] format Format string to be printed.
|
||
|
* @return LY_ERR value.
|
||
|
*/
|
||
|
LY_ERR ly_print_(struct ly_out *out, const char *format, ...);
|
||
|
|
||
|
/**
|
||
|
* @brief Generic printer of the given string buffer into the specified output.
|
||
|
*
|
||
|
* Does not reset printed bytes. Adds to printed bytes.
|
||
|
*
|
||
|
* @param[in] out Output specification.
|
||
|
* @param[in] buf Memory buffer with the data to print.
|
||
|
* @param[in] len Length of the data to print in the @p buf.
|
||
|
* @return LY_ERR value.
|
||
|
*/
|
||
|
LY_ERR ly_write_(struct ly_out *out, const char *buf, size_t len);
|
||
|
|
||
|
/**
|
||
|
* @brief Create a hole in the output data that will be filled later.
|
||
|
*
|
||
|
* Adds printed bytes.
|
||
|
*
|
||
|
* @param[in] out Output specification.
|
||
|
* @param[in] len Length of the created hole.
|
||
|
* @param[out] position Position of the hole, value must be later provided to the ::ly_write_skipped() call.
|
||
|
* @return LY_ERR value.
|
||
|
*/
|
||
|
LY_ERR ly_write_skip(struct ly_out *out, size_t len, size_t *position);
|
||
|
|
||
|
/**
|
||
|
* @brief Write data into the hole at given position.
|
||
|
*
|
||
|
* Does not change printed bytes.
|
||
|
*
|
||
|
* @param[in] out Output specification.
|
||
|
* @param[in] position Position of the hole to fill, the value was provided by ::ly_write_skip().
|
||
|
* @param[in] buf Memory buffer with the data to print.
|
||
|
* @param[in] len Length of the data to print in the @p buf. Not that the length must correspond
|
||
|
* to the len value specified in the corresponding ::ly_write_skip() call.
|
||
|
* @return LY_ERR value.
|
||
|
*/
|
||
|
LY_ERR ly_write_skipped(struct ly_out *out, size_t position, const char *buf, size_t len);
|
||
|
|
||
|
#endif /* LY_OUT_INTERNAL_H_ */
|