mirror_frr/lib/sbuf.h
Louis Scalbert 6c2cafdcb0 lib: extend sbuf size
sbuf variable is used among other things to store IS-IS database output.
Future commits will introduce the output of extended access groups in
the "show isis database detail" output.

Extend the sbuf size to have chance to store all information.

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-02-10 11:31:05 +01:00

90 lines
2.7 KiB
C

/*
* Simple string buffer
*
* Copyright (C) 2017 Christian Franke
*
* This file is part of FRR.
*
* FRR is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* FRR is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FRR; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef SBUF_H
#define SBUF_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* sbuf provides a simple string buffer. One application where this comes
* in handy is the parsing of binary data: If there is an error in the parsing
* process due to invalid input data, printing an error message explaining what
* went wrong is definitely useful. However, just printing the actual error,
* without any information about the previous parsing steps, is usually not very
* helpful.
* Using sbuf, the parser can log the whole parsing process into a buffer using
* a printf like API. When an error occurs, all the information about previous
* parsing steps is there in the log, without any need for backtracking, and can
* be used to give a detailed and useful error description.
* When parsing completes successfully without any error, the log can just be
* discarded unless debugging is turned on, to not spam the log.
*
* For the described usecase, the code would look something like this:
*
* int sbuf_example(..., char **parser_log)
* {
* struct sbuf logbuf;
*
* sbuf_init(&logbuf, NULL, 0);
* sbuf_push(&logbuf, 0, "Starting parser\n");
*
* int rv = do_parse(&logbuf, ...);
*
* *parser_log = sbuf_buf(&logbuf);
*
* return 1;
* }
*
* In this case, sbuf_example uses a string buffer with undefined size, which
* will
* be allocated on the heap by sbuf. The caller of sbuf_example is expected to
* free
* the string returned in parser_log.
*/
#define SBUF_DEFAULT_SIZE 8192
struct sbuf {
bool fixed;
char *buf;
size_t size;
size_t pos;
int indent;
};
void sbuf_init(struct sbuf *dest, char *buf, size_t size);
void sbuf_reset(struct sbuf *buf);
const char *sbuf_buf(struct sbuf *buf);
void sbuf_free(struct sbuf *buf);
#include "lib/log.h"
void sbuf_push(struct sbuf *buf, int indent, const char *format, ...)
PRINTFRR(3, 4);
#ifdef __cplusplus
}
#endif
#endif