/* A simple growing buffer for GDB.
  
   Copyright (C) 2009-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program 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 3 of the License, or
   (at your option) any later version.

   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef COMMON_BUFFER_H
#define COMMON_BUFFER_H

struct buffer
{
  char *buffer;
  size_t buffer_size; /* allocated size */
  size_t used_size; /* actually used size */
};

/* Append DATA of size SIZE to the end of BUFFER.  Grows the buffer to
   accommodate the new data.  */
void buffer_grow (struct buffer *buffer, const char *data, size_t size);

/* Append C to the end of BUFFER.  Grows the buffer to accommodate the
   new data.  */

static inline void
buffer_grow_char (struct buffer *buffer, char c)
{
  buffer_grow (buffer, &c, 1);
}

/* Release any memory held by BUFFER.  */
void buffer_free (struct buffer *buffer);

/* Initialize BUFFER.  BUFFER holds no memory afterwards.  */
void buffer_init (struct buffer *buffer);

/* Return a pointer into BUFFER data, effectively transferring
   ownership of the buffer memory to the caller.  Calling buffer_free
   afterwards has no effect on the returned data.  */
char* buffer_finish (struct buffer *buffer);

/* Simple printf to buffer function.  Current implemented formatters:
   %s - grow an xml escaped text in BUFFER.
   %d - grow an signed integer in BUFFER.
   %u - grow an unsigned integer in BUFFER.
   %x - grow an unsigned integer formatted in hexadecimal in BUFFER.
   %o - grow an unsigned integer formatted in octal in BUFFER.  */
void buffer_xml_printf (struct buffer *buffer, const char *format, ...)
  ATTRIBUTE_PRINTF (2, 3);

#define buffer_grow_str(BUFFER,STRING)		\
  buffer_grow (BUFFER, STRING, strlen (STRING))
#define buffer_grow_str0(BUFFER,STRING)			\
  buffer_grow (BUFFER, STRING, strlen (STRING) + 1)

#endif /* COMMON_BUFFER_H */
