blob: a94cea87a31ba8d365ecac81fe71a99f18542b6c [file]
.. Copyright (C) 2025-2026 Free Software Foundation, Inc.
Originally contributed by David Malcolm <dmalcolm@redhat.com>
This 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
<https://www.gnu.org/licenses/>.
.. default-domain:: c
Message buffers
===============
.. type:: diagnostic_message_buffer
A :type:`diagnostic_message_buffer` is a buffer into which text can be
accumulated, before being used:
* as the message of a diagnostic, using :func:`diagnostic_finish_via_msg_buf`
* as the text of a label for a :type:`diagnostic_physical_location` using
:func:`diagnostic_add_location_with_label_via_msg_buf`
* as the text of an event within a :type:`diagnostic_execution_path` using
:func:`diagnostic_execution_path_add_event_via_msg_buf`
This is to allow more flexible creation of messages than a "format string
plus variadic arguments" API.
.. function:: diagnostic_message_buffer * diagnostic_message_buffer_new (void)
This function creates a new :type:`diagnostic_message_buffer`.
The caller is responsible for cleaning it up, either by handing it off
to one of the API entrypoints that takes ownership of it (such as
:func:`diagnostic_finish_via_msg_buf`), or by calling
:func:`diagnostic_message_buffer_release` on it.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_release (diagnostic_message_buffer *msg_buf)
This function releases ``msg_buf``.
Typically you don't need to call this, but instead will pass the
buffer to one of the API entrypoints that takes over ownership of
it (such as :func:`diagnostic_finish_via_msg_buf`); calling it
after this would lead to a double-free bug, as you no longer "own"
the buffer.
``msg_buf`` must be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_append_str (diagnostic_message_buffer *msg_buf, \
const char *p)
This function appends the null-terminated string ``p`` to the buffer.
The string is assumed to be UTF-8 encoded.
``msg_buf`` and ``p`` must both be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_append_text (diagnostic_message_buffer *msg_buf, \
const char *p, \
size_t len)
This function appends ``len`` bytes from ``p`` to the buffer.
The bytes are assumed to be UTF-8 encoded.
``msg_buf`` and ``p`` must both be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_append_byte (diagnostic_message_buffer *msg_buf,\
char ch)
This function appends ``ch`` to the buffer. This should be either
ASCII, or part of UTF-8 encoded text.
``msg_buf`` must be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_append_printf (diagnostic_message_buffer *msg_buf, \
const char *fmt, ...)
This function appends a formatted string to the buffer, using the
formatting rules for ``printf``.
The string is assumed to be UTF-8 encoded.
``msg_buf`` and ``fmt`` must both be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_append_event_id (diagnostic_message_buffer *msg_buf, \
diagnostic_event_id event_id)
This function appends a :type:`diagnostic_event_id` to the buffer.
``msg_buf`` must be non-NULL.
For text output, the event will be printed in the form ``(1)``.
This is analogous to the
:doc:`%@ message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
Hyperlink support
*****************
.. function:: void diagnostic_message_buffer_begin_url (diagnostic_message_buffer *msg_buf, \
const char *url)
This function indicates the beginning of a run of text that should be
associated with the given URL. The run of text should be closed with
a matching call to :func:`diagnostic_message_buffer_end_url`.
``msg_buf`` and ``url`` must both be non-NULL.
For text output in a suitably modern terminal, the run of text will
be emitted as a clickable hyperlink to the URL.
For SARIF sinks, the run of text will be emitted using SARIF's
embedded link syntax.
This is analogous to the
:doc:`%{ message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_end_url (diagnostic_message_buffer *msg_buf)
This function ends a run of text within the buffer started with
:func:`diagnostic_message_buffer_begin_url`.
``msg_buf`` must be non-NULL.
This is analogous to the
:doc:`%} message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
Quoted text
***********
.. function:: void diagnostic_message_buffer_begin_quote (diagnostic_message_buffer *msg_buf)
This function indicates the beginning of a run of text that should be
printed in quotes. The run of text should be closed with
a matching call to :func:`diagnostic_message_buffer_end_quote`.
``msg_buf`` must be non-NULL.
For text output in a suitably modern terminal, the run of text will
appear in bold.
be emitted as a clickable hyperlink to the URL.
For SARIF sinks, the run of text will be emitted using SARIF's
embedded link syntax.
This is analogous to the
``%<``:doc:`message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_end_url (diagnostic_message_buffer *msg_buf)
This function ends a run of text within the buffer started with
:func:`diagnostic_message_buffer_begin_url`.
``msg_buf`` must be non-NULL.
This is analogous to the
:doc:`%> message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
Color
*****
.. function:: void diagnostic_message_buffer_begin_color (diagnostic_message_buffer *msg_buf, \
const char *color)
This function indicates the beginning of a run of text that should be
colorized as the given color. The run of text should be closed with
a matching call to :func:`diagnostic_message_buffer_end_color`.
The precise set of available color names is currently undocumented.
``msg_buf`` and ``color`` must both be non-NULL.
For text output in a suitable terminal, the run of text will
be colorized.
For SARIF sinks, the run of text will be emitted using SARIF's
embedded link syntax.
This is analogous to the
:doc:`%r message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
.. function:: void diagnostic_message_buffer_end_color (diagnostic_message_buffer *msg_buf)
This function ends a run of text within the buffer started with
:func:`diagnostic_message_buffer_begin_color`.
``msg_buf`` must be non-NULL.
This is analogous to the
:doc:`%R message formatting code <message-formatting>`.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer
Debugging a message buffer
**************************
.. function:: void diagnostic_message_buffer_dump (const diagnostic_message_buffer *msg_buf, \
FILE *outf)
This function writes a representation of the contents of ``msg_buf``
to ``outf``, for debugging.
``msg_buf`` can be NULL or non-NULL.
``outf`` must be non-NULL.
This function was added in :ref:`LIBGDIAGNOSTICS_ABI_4`; you can
test for its presence using
.. code-block:: c
#ifdef LIBDIAGNOSTICS_HAVE_diagnostic_message_buffer