.. Copyright (C) 2025 Free Software Foundation, Inc. Originally contributed by David Malcolm 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 . .. 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 `. 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 `. 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 `. 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 `. 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 `. 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 `. 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 `. 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