pw_tokenizer: Delete unused code; update docs
- Remove PW_TOKENIZE_TO_GLOBAL_HANDLER() and PW_TOKENIZE_TO_CALLBACK(),
which are not used.
- Mark PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD() as deprecated. A
custom macro that calls a user-defined function is preferred.
- Update the documentation.
Change-Id: Ic8f41bf35e91d4ef5273205003b999f397981009
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/128651
Reviewed-by: Erik Gilling <konkers@google.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: Keir Mierle <keir@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_assert_tokenized/docs.rst b/pw_assert_tokenized/docs.rst
index c423b1e..3530e44 100644
--- a/pw_assert_tokenized/docs.rst
+++ b/pw_assert_tokenized/docs.rst
@@ -49,10 +49,11 @@
#. Set ``pw_assert_BACKEND = "$dir_pw_assert_tokenized:check_backend"`` and
``pw_assert_LITE_BACKEND = "$dir_pw_assert_tokenized:assert_backend"`` in
your target configuration.
-#. Ensure your target provides ``pw_tokenizer_GLOBAL_HANDLER_BACKEND``. By
- default, pw_assert_tokenized will forward assert failures to the tokenizer
- handler as logs. The tokenizer handler should check for ``LOG_LEVEL_FATAL``
- and properly divert to a crash handler.
+#. Ensure your target provides
+ ``pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND``. By default,
+ pw_assert_tokenized will forward assert failures to the tokenizer handler as
+ logs. The tokenizer handler should check for ``LOG_LEVEL_FATAL`` and properly
+ divert to a crash handler.
#. Add file name tokens to your token database. pw_assert_tokenized can't create
file name tokens that can be parsed out of the final compiled binary. The
``pw_relative_source_file_names``
diff --git a/pw_tokenizer/BUILD.bazel b/pw_tokenizer/BUILD.bazel
index 32d90e8..4f4fe92 100644
--- a/pw_tokenizer/BUILD.bazel
+++ b/pw_tokenizer/BUILD.bazel
@@ -63,16 +63,6 @@
)
pw_cc_library(
- name = "global_handler",
- srcs = ["tokenize_to_global_handler.cc"],
- hdrs = ["public/pw_tokenizer/tokenize_to_global_handler.h"],
- deps = [
- ":pw_tokenizer",
- "@pigweed_config//:pw_tokenizer_global_handler_backend",
- ],
-)
-
-pw_cc_library(
name = "global_handler_with_payload",
srcs = ["tokenize_to_global_handler_with_payload.cc"],
hdrs = ["public/pw_tokenizer/tokenize_to_global_handler_with_payload.h"],
@@ -231,10 +221,7 @@
"global_handlers_test_c.c",
"pw_tokenizer_private/tokenize_test.h",
],
- deps = [
- ":global_handler",
- ":global_handler_with_payload",
- ],
+ deps = [":global_handler_with_payload"],
)
pw_cc_test(
@@ -256,7 +243,6 @@
"simple_tokenize_test.cc",
],
deps = [
- ":global_handler",
":global_handler_with_payload",
":pw_tokenizer",
"//pw_unit_test",
diff --git a/pw_tokenizer/BUILD.gn b/pw_tokenizer/BUILD.gn
index 46b624b..3d279e0 100644
--- a/pw_tokenizer/BUILD.gn
+++ b/pw_tokenizer/BUILD.gn
@@ -105,15 +105,13 @@
# As a temporary workaround, if no backend is set, use an empty test backend so
# that the test can define the handler function.
# TODO(hepler): Switch this to a facade test when available.
-if (pw_tokenizer_GLOBAL_HANDLER_BACKEND == "" &&
- pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND == "") {
+if (pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND == "") {
# This is an empty library to use as the backend for global_handler and
# global_handler_with_payload tests.
pw_source_set("test_backend") {
visibility = [ ":*" ]
}
- pw_tokenizer_GLOBAL_HANDLER_BACKEND = ":test_backend"
pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND = ":test_backend"
enable_global_handler_test = true
@@ -121,15 +119,6 @@
enable_global_handler_test = false
}
-pw_facade("global_handler") {
- backend = pw_tokenizer_GLOBAL_HANDLER_BACKEND
-
- public_configs = [ ":public_include_path" ]
- public = [ "public/pw_tokenizer/tokenize_to_global_handler.h" ]
- sources = [ "tokenize_to_global_handler.cc" ]
- public_deps = [ ":pw_tokenizer" ]
-}
-
pw_facade("global_handler_with_payload") {
backend = pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND
@@ -263,10 +252,7 @@
"global_handlers_test_c.c",
"pw_tokenizer_private/tokenize_test.h",
]
- deps = [
- ":global_handler",
- ":global_handler_with_payload",
- ]
+ deps = [ ":global_handler_with_payload" ]
# TODO(hepler): Switch this to a facade test when available.
enable_if = enable_global_handler_test
@@ -283,7 +269,6 @@
pw_test("simple_tokenize_test") {
sources = [ "simple_tokenize_test.cc" ]
deps = [
- ":global_handler",
":global_handler_with_payload",
":pw_tokenizer",
]
diff --git a/pw_tokenizer/CMakeLists.txt b/pw_tokenizer/CMakeLists.txt
index 4fbf644..f60729c 100644
--- a/pw_tokenizer/CMakeLists.txt
+++ b/pw_tokenizer/CMakeLists.txt
@@ -103,20 +103,6 @@
pw_varint
)
-pw_add_facade(pw_tokenizer.global_handler STATIC
- BACKEND
- pw_tokenizer.global_handler_BACKEND
- HEADERS
- public/pw_tokenizer/tokenize_to_global_handler.h
- PUBLIC_INCLUDES
- public
- PUBLIC_DEPS
- pw_preprocessor
- pw_tokenizer
- SOURCES
- tokenize_to_global_handler.cc
-)
-
pw_add_facade(pw_tokenizer.global_handler_with_payload STATIC
BACKEND
pw_tokenizer.global_handler_with_payload_BACKEND
diff --git a/pw_tokenizer/backend.cmake b/pw_tokenizer/backend.cmake
index 1890f39..997b18e 100644
--- a/pw_tokenizer/backend.cmake
+++ b/pw_tokenizer/backend.cmake
@@ -15,7 +15,5 @@
include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
-# Backends for the pw_tokenizer:global_handler and
-# pw_tokenizer:global_handler_with_payload facades
-pw_add_backend_variable(pw_tokenizer.global_handler_BACKEND)
+# Backend for the pw_tokenizer:global_handler_with_payload facade.
pw_add_backend_variable(pw_tokenizer.global_handler_with_payload_BACKEND)
diff --git a/pw_tokenizer/backend.gni b/pw_tokenizer/backend.gni
index dd00ac9..9f01212 100644
--- a/pw_tokenizer/backend.gni
+++ b/pw_tokenizer/backend.gni
@@ -13,8 +13,6 @@
# the License.
declare_args() {
- # Backends for the pw_tokenizer:global_handler and
- # pw_tokenizer:global_handler_with_payload facades.
- pw_tokenizer_GLOBAL_HANDLER_BACKEND = ""
+ # Backend for the pw_tokenizer:global_handler_with_payload facade.
pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND = ""
}
diff --git a/pw_tokenizer/docs.rst b/pw_tokenizer/docs.rst
index 6c16979..47cbf16 100644
--- a/pw_tokenizer/docs.rst
+++ b/pw_tokenizer/docs.rst
@@ -168,106 +168,123 @@
Tokenize a string literal
-------------------------
-The ``PW_TOKENIZE_STRING`` macro converts a string literal to a ``uint32_t``
-token.
+``pw_tokenizer`` provides macros for tokenizing string literals with no
+arguments.
-.. code-block:: cpp
+.. c:macro:: PW_TOKENIZE_STRING(string_literal)
- constexpr uint32_t token = PW_TOKENIZE_STRING("Any string literal!");
+ Converts a string literal to a ``uint32_t`` token in a standalone statement.
+ C and C++ compatible.
-.. admonition:: When to use this macro
+ .. code-block:: cpp
- Use ``PW_TOKENIZE_STRING`` to tokenize string literals that do not have
- %-style arguments.
+ constexpr uint32_t token = PW_TOKENIZE_STRING("Any string literal!");
-Tokenize to a handler function
-------------------------------
-``PW_TOKENIZE_TO_GLOBAL_HANDLER`` is the most efficient tokenization function,
-since it takes the fewest arguments. It encodes a tokenized string to a
-buffer on the stack. The size of the buffer is set with
-``PW_TOKENIZER_CFG_ENCODING_BUFFER_SIZE_BYTES``.
+.. c:macro:: PW_TOKENIZE_STRING_DOMAIN(domain, string_literal)
-This macro is provided by the ``pw_tokenizer:global_handler`` facade. The
-backend for this facade must define the ``pw_tokenizer_HandleEncodedMessage``
-C-linkage function.
+ Tokenizes a string literal in a standalone statement using the specified
+ :ref:`domain <module-pw_tokenizer-domains>`. C and C++ compatible.
-.. code-block:: cpp
+.. c:macro:: PW_TOKENIZE_STRING_MASK(domain, mask, string_literal)
- PW_TOKENIZE_TO_GLOBAL_HANDLER(format_string_literal, arguments...);
+ Tokenizes a string literal in a standalone stateemnt using the specified
+ :ref:`domain <module-pw_tokenizer-domains>` and :ref:`bit mask
+ <module-pw_tokenizer-masks>`. C and C++ compatible.
- void pw_tokenizer_HandleEncodedMessage(const uint8_t encoded_message[],
- size_t size_bytes);
+The tokenization macros above cannot be used inside other expressions.
-``PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD`` is similar, but passes a
-``uintptr_t`` argument to the global handler function. Values like a log level
-can be packed into the ``uintptr_t``.
+.. admonition:: **Yes**: Assign :c:macro:`PW_TOKENIZE_STRING` to a ``constexpr`` variable.
+ :class: checkmark
-This macro is provided by the ``pw_tokenizer:global_handler_with_payload``
-facade. The backend for this facade must define the
-``pw_tokenizer_HandleEncodedMessageWithPayload`` C-linkage function.
+ .. code:: cpp
-.. code-block:: cpp
+ constexpr uint32_t kGlobalToken = PW_TOKENIZE_STRING("Wowee Zowee!");
- PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD(payload,
- format_string_literal,
- arguments...);
+ void Function() {
+ constexpr uint32_t local_token = PW_TOKENIZE_STRING("Wowee Zowee?");
+ }
- void pw_tokenizer_HandleEncodedMessageWithPayload(
- uintptr_t payload, const uint8_t encoded_message[], size_t size_bytes);
+.. admonition:: **No**: Use :c:macro:`PW_TOKENIZE_STRING` in another expression.
+ :class: error
+
+ .. code:: cpp
+
+ void BadExample() {
+ ProcessToken(PW_TOKENIZE_STRING("This won't compile!"));
+ }
+
+ Use :c:macro:`PW_TOKENIZE_STRING_EXPR` instead.
+
+An alternate set of macros are provided for use inside expressions. These make
+use of lambda functions, so while they can be used inside expressions, they
+require C++ and cannot be assigned to constexpr variables or be used with
+special function variables like ``__func__``.
+
+.. c:macro:: PW_TOKENIZE_STRING_EXPR(string_literal)
+
+ Converts a string literal to a ``uint32_t`` token within an expression.
+ Requires C++.
+
+ .. code-block:: cpp
+
+ DoSomething(PW_TOKENIZE_STRING_EXPR("Succeed"));
+
+.. c:macro:: PW_TOKENIZE_STRING_DOMAIN_EXPR(domain, string_literal)
+
+ Tokenizes a string literal using the specified :ref:`domain
+ <module-pw_tokenizer-domains>` within an expression. Requires C++.
+
+.. c:macro:: PW_TOKENIZE_STRING_MASK_EXPR(domain, mask, string_literal)
+
+ Tokenizes a string literal using the specified :ref:`domain
+ <module-pw_tokenizer-domains>` and :ref:`bit mask
+ <module-pw_tokenizer-masks>` within an expression. Requires C++.
.. admonition:: When to use these macros
- Use anytime a global handler is sufficient, particularly for widely expanded
- macros, like a logging macro. ``PW_TOKENIZE_TO_GLOBAL_HANDLER`` or
- ``PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD`` are the most efficient macros
- for tokenizing printf-style strings.
+ Use :c:macro:`PW_TOKENIZE_STRING` and related macros to tokenize string
+ literals that do not need %-style arguments encoded.
-Tokenize to a callback
-----------------------
-``PW_TOKENIZE_TO_CALLBACK`` tokenizes to a buffer on the stack and calls a
-``void(const uint8_t* buffer, size_t buffer_size)`` callback that is provided at
-the call site. The size of the buffer is set with
-``PW_TOKENIZER_CFG_ENCODING_BUFFER_SIZE_BYTES``.
+.. admonition:: **Yes**: Use :c:macro:`PW_TOKENIZE_STRING_EXPR` within other expressions.
+ :class: checkmark
-.. code-block:: cpp
+ .. code:: cpp
- PW_TOKENIZE_TO_CALLBACK(HandlerFunction, "Format string: %x", arguments...);
+ void GoodExample() {
+ ProcessToken(PW_TOKENIZE_STRING_EXPR("This will compile!"));
+ }
-.. admonition:: When to use this macro
+.. admonition:: **No**: Assign :c:macro:`PW_TOKENIZE_STRING_EXPR` to a ``constexpr`` variable.
+ :class: error
- Use ``PW_TOKENIZE_TO_CALLBACK`` if the global handler version is already in
- use for another purpose or more flexibility is needed.
+ .. code:: cpp
-Tokenize to a buffer
---------------------
-The most flexible tokenization macro is ``PW_TOKENIZE_TO_BUFFER``, which encodes
-to a caller-provided buffer.
+ constexpr uint32_t wont_work = PW_TOKENIZE_STRING_EXPR("This won't compile!"));
-.. code-block:: cpp
+ Instead, use :c:macro:`PW_TOKENIZE_STRING` to assign to a ``constexpr`` variable.
- uint8_t buffer[BUFFER_SIZE];
- size_t size_bytes = sizeof(buffer);
- PW_TOKENIZE_TO_BUFFER(buffer, &size_bytes, format_string_literal, arguments...);
+.. admonition:: **No**: Tokenize ``__func__`` in :c:macro:`PW_TOKENIZE_STRING_EXPR`.
+ :class: error
-While ``PW_TOKENIZE_TO_BUFFER`` is maximally flexible, it takes more arguments
-than the other macros, so its per-use code size overhead is larger.
+ .. code:: cpp
-.. admonition:: When to use this macro
+ void BadExample() {
+ // This compiles, but __func__ will not be the outer function's name, and
+ // there may be compiler warnings.
+ constexpr uint32_t wont_work = PW_TOKENIZE_STRING_EXPR(__func__);
+ }
- Use ``PW_TOKENIZE_TO_BUFFER`` to encode to a custom-sized buffer or if the
- other macros are insufficient. Avoid using ``PW_TOKENIZE_TO_BUFFER`` in
- widely expanded macros, such as a logging macro, because it will result in
- larger code size than its alternatives.
+ Instead, use :c:macro:`PW_TOKENIZE_STRING` to tokenize ``__func__`` or similar macros.
.. _module-pw_tokenizer-custom-macro:
-Tokenize with a custom macro
-----------------------------
-Projects may need more flexbility than the standard ``pw_tokenizer`` macros
-provide. To support this, projects may define custom tokenization macros. This
-requires the use of two low-level ``pw_tokenizer`` macros:
+Tokenize a message with arguments in a custom macro
+---------------------------------------------------
+Projects can leverage the tokenization machinery in whichever way best suits
+their needs. ``pw_tokenizer`` provides two low-level macros for projects to use
+to create custom tokenization macros.
-.. c:macro:: PW_TOKENIZE_FORMAT_STRING(domain, mask, format, ...)
+.. c:macro:: PW_TOKENIZE_FORMAT_STRING(domain, mask, format_string, ...)
Tokenizes a format string and sets the ``_pw_tokenizer_token`` variable to the
token. Must be used in its own scope, since the same variable is used in every
@@ -282,9 +299,10 @@
Converts a series of arguments to a compact format that replaces the format
string literal.
-Use these two macros within the custom tokenization macro to call a function
-that does the encoding. The following example implements a custom tokenization
-macro for use with :ref:`module-pw_log_tokenized`.
+The most efficient way to use ``pw_tokenizer`` is to pass tokenized data to a
+global handler function. A project's custom tokenization macro can handle
+tokenized data in a function of their choosing. The following example implements
+a custom tokenization macro for use with :ref:`module-pw_log_tokenized`.
.. code-block:: cpp
@@ -339,14 +357,66 @@
HandleTokenizedMessage(metadata, encoded_message);
}
-.. admonition:: When to use a custom macro
+.. admonition:: Why use a custom macro
- Use existing tokenization macros whenever possible. A custom macro may be
- needed to support use cases like the following:
+ - Optimal code size. Invoking a free function with the tokenized data results
+ in the smallest possible call site.
+ - Pass additional arguments, such as metadata, with the tokenized message.
+ - Integrate ``pw_tokenizer`` with other systems.
- * Variations of ``PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD`` that take
- different arguments.
- * Supporting global handler macros that use different handler functions.
+Tokenize a message with arguments to a buffer
+---------------------------------------------
+.. c:macro:: PW_TOKENIZE_TO_BUFFER(buffer_pointer, buffer_size_pointer, format_string, arguments...)
+
+ ``PW_TOKENIZE_TO_BUFFER`` encodes to a caller-provided buffer.
+
+ .. code-block:: cpp
+
+ uint8_t buffer[BUFFER_SIZE];
+ size_t size_bytes = sizeof(buffer);
+ PW_TOKENIZE_TO_BUFFER(buffer, &size_bytes, format_string_literal, arguments...);
+
+ While ``PW_TOKENIZE_TO_BUFFER`` is very flexible, it must be passed a buffer,
+ which increases its call site overhead.
+
+.. admonition:: Why use this macro
+
+ - Encode a tokenized message for consumption within a function.
+ - Encode a tokenized message into an existing buffer.
+
+ Avoid using ``PW_TOKENIZE_TO_BUFFER`` in widely expanded macros, such as a
+ logging macro, because it will result in larger code size than passing the
+ tokenized data to a function.
+
+Tokenize to a global handler function (deprecated)
+--------------------------------------------------
+``pw_tokenizer`` provides the ``PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD``
+macro that tokenizes to a global handler function. This macro is deprecated and
+should not be used in new code. Create a :ref:`custom macro
+<module-pw_tokenizer-custom-macro>` instead.
+
+``PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD`` passes a ``uintptr_t`` argument
+along with the tokenized data. Values like a log level can be packed into the
+``uintptr_t``. The tokenized string is encoded to a buffer on the stack. The
+size of the buffer is set with ``PW_TOKENIZER_CFG_ENCODING_BUFFER_SIZE_BYTES``.
+
+This macro is provided by the ``pw_tokenizer:global_handler_with_payload``
+facade. The backend for this facade must define the
+``pw_tokenizer_HandleEncodedMessageWithPayload`` C-linkage function.
+
+.. code-block:: cpp
+
+ PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD(payload,
+ format_string_literal,
+ arguments...);
+
+ void pw_tokenizer_HandleEncodedMessageWithPayload(
+ uintptr_t payload, const uint8_t encoded_message[], size_t size_bytes);
+
+.. admonition:: Why use this macro
+
+ This macro is deprecated and should not be used. To invoke a global function,
+ create a :ref:`custom tokenization macro<module-pw_tokenizer-custom-macro>`.
Binary logging with pw_tokenizer
================================
@@ -552,6 +622,8 @@
See `Managing token databases`_ for information about the ``database.py``
command line tool.
+.. _module-pw_tokenizer-masks:
+
Smaller tokens with masking
===========================
``pw_tokenizer`` uses 32-bit tokens. On 32-bit or 64-bit architectures, using
@@ -652,32 +724,6 @@
such as module names, but won't be suitable for large sets of strings, like log
messages.
-Using tokenization in expressions
-=================================
-The tokenization macros above cannot be used inside expressions. For example,
-the following code snippet will fail to compile:
-
-.. code-block:: cpp
-
- DoSomething(PW_TOKENIZE_STRING("Fail"));
-
-An alternate set of macros are provided for use inside expressions. These make
-use of lambda functions, so while they can be used inside expressions, they
-cannot be assigned to constexpr variables or be used with special function
-variables like ``__func__``.
-
-The following tokenization macros may be used inside epxressions:
-
-* ``PW_TOKENIZE_STRING_EXPR``
-* ``PW_TOKENIZE_STRING_DOMAIN_EXPR``
-* ``PW_TOKENIZE_STRING_MASK_EXPR``
-
-For example, the following code snippet will work:
-
-.. code-block:: cpp
-
- DoSomething(PW_TOKENIZE_STRING_EXPR("Succeed"));
-
---------------
Token databases
---------------
@@ -1416,7 +1462,9 @@
``pw_tokenizer_HandleEncodedMessageWithPayload``, the log messages were
encoded in the $-prefixed `Base64 format`_, then dispatched as normal log
messages.
-* Asserts were tokenized using ``PW_TOKENIZE_TO_CALLBACK``.
+* Asserts were tokenized a callback-based API that has been removed (a
+ :ref:`custom macro <module-pw_tokenizer-custom-macro>` is a better
+ alternative).
.. attention::
Do not encode line numbers in tokenized strings. This results in a huge
diff --git a/pw_tokenizer/global_handlers_test.cc b/pw_tokenizer/global_handlers_test.cc
index bef914e..b79dab8 100644
--- a/pw_tokenizer/global_handlers_test.cc
+++ b/pw_tokenizer/global_handlers_test.cc
@@ -17,7 +17,6 @@
#include <cstring>
#include "gtest/gtest.h"
-#include "pw_tokenizer/tokenize_to_global_handler.h"
#include "pw_tokenizer/tokenize_to_global_handler_with_payload.h"
#include "pw_tokenizer_private/tokenize_test.h"
@@ -65,58 +64,6 @@
template <typename Impl>
size_t GlobalMessage<Impl>::message_size_bytes_ = 0;
-class TokenizeToGlobalHandler : public GlobalMessage<TokenizeToGlobalHandler> {
-};
-
-TEST_F(TokenizeToGlobalHandler, Variety) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER("%x%lld%1.2f%s", 0, 0ll, -0.0, "");
- const auto expected =
- ExpectedData<0, 0, 0x00, 0x00, 0x00, 0x80, 0>("%x%lld%1.2f%s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToGlobalHandler, Strings) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER("The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToGlobalHandler, Domain_Strings) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER_DOMAIN(
- "TEST_DOMAIN", "The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToGlobalHandler, Mask) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER_MASK(
- "TEST_DOMAIN", 0x00FFF000, "The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s", 0x00FFF000);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToGlobalHandler, C_SequentialZigZag) {
- pw_tokenizer_ToGlobalHandlerTest_SequentialZigZag();
-
- constexpr std::array<uint8_t, 18> expected =
- ExpectedData<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13>(
- TEST_FORMAT_SEQUENTIAL_ZIG_ZAG);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-extern "C" void pw_tokenizer_HandleEncodedMessage(
- const uint8_t* encoded_message, size_t size_bytes) {
- TokenizeToGlobalHandler::SetMessage(encoded_message, size_bytes);
-}
-
class TokenizeToGlobalHandlerWithPayload
: public GlobalMessage<TokenizeToGlobalHandlerWithPayload> {
public:
@@ -253,26 +200,6 @@
tokenizer_domain = domain; \
string_literal = string
-TEST_F(TokenizeToGlobalHandler, Domain_Default) {
- const char* tokenizer_domain = nullptr;
- const char* string_literal = nullptr;
-
- PW_TOKENIZE_TO_GLOBAL_HANDLER("404");
-
- EXPECT_STREQ(tokenizer_domain, PW_TOKENIZER_DEFAULT_DOMAIN);
- EXPECT_STREQ(string_literal, "404");
-}
-
-TEST_F(TokenizeToGlobalHandler, Domain_Specified) {
- const char* tokenizer_domain = nullptr;
- const char* string_literal = nullptr;
-
- PW_TOKENIZE_TO_GLOBAL_HANDLER_DOMAIN("www.google.com", "404");
-
- EXPECT_STREQ(tokenizer_domain, "www.google.com");
- EXPECT_STREQ(string_literal, "404");
-}
-
TEST_F(TokenizeToGlobalHandlerWithPayload, Domain_Default) {
const char* tokenizer_domain = nullptr;
const char* string_literal = nullptr;
diff --git a/pw_tokenizer/global_handlers_test_c.c b/pw_tokenizer/global_handlers_test_c.c
index 04d5551..fd8957b 100644
--- a/pw_tokenizer/global_handlers_test_c.c
+++ b/pw_tokenizer/global_handlers_test_c.c
@@ -15,7 +15,6 @@
// This function tests the C implementation of tokenization API. These functions
// are called from the main C++ test file.
-#include "pw_tokenizer/tokenize_to_global_handler.h"
#include "pw_tokenizer/tokenize_to_global_handler_with_payload.h"
#include "pw_tokenizer_private/tokenize_test.h"
@@ -26,23 +25,6 @@
// This test invokes the tokenization API with a variety of types. To simplify
// validating the encoded data, numbers that are sequential when zig-zag encoded
// are used as arguments.
-void pw_tokenizer_ToGlobalHandlerTest_SequentialZigZag(void) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER(TEST_FORMAT_SEQUENTIAL_ZIG_ZAG,
- 0u,
- -1,
- 1u,
- (unsigned)-2,
- (unsigned short)2u,
- (signed char)-3,
- 3,
- -4l,
- 4ul,
- -5ll,
- 5ull,
- (signed char)-6,
- (char)6,
- (signed char)-7);
-}
void pw_tokenizer_ToGlobalHandlerWithPayloadTest_SequentialZigZag(void) {
PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD((pw_tokenizer_Payload)600613,
diff --git a/pw_tokenizer/public/pw_tokenizer/tokenize.h b/pw_tokenizer/public/pw_tokenizer/tokenize.h
index 5f8cefa..fd96715 100644
--- a/pw_tokenizer/public/pw_tokenizer/tokenize.h
+++ b/pw_tokenizer/public/pw_tokenizer/tokenize.h
@@ -157,53 +157,6 @@
PW_COMMA_ARGS(__VA_ARGS__)); \
} while (0)
-// Encodes a tokenized string and arguments to a buffer on the stack. The
-// provided callback is called with the encoded data. The size of the
-// stack-allocated argument encoding buffer is set with the
-// PW_TOKENIZER_CFG_ENCODING_BUFFER_SIZE_BYTES option.
-//
-// The macro's arguments are equivalent to the following function signature:
-//
-// TokenizeToCallback(void (*callback)(const uint8_t* data, size_t size),
-// const char* format,
-// ...); /* printf-style arguments */
-//
-// For example, the following encodes a tokenized string with a sensor name and
-// floating point data. The encoded message is passed directly to the
-// MyProject_EnqueueMessageForUart function, which the caller provides as a
-// callback.
-//
-// void MyProject_EnqueueMessageForUart(const uint8_t* buffer,
-// size_t size_bytes) {
-// uart_queue_write(uart_instance, buffer, size_bytes);
-// }
-//
-// void LogSensorValue(const char* sensor_name, float value) {
-// PW_TOKENIZE_TO_CALLBACK(MyProject_EnqueueMessageForUart,
-// "%s: %f",
-// sensor_name,
-// value);
-// }
-//
-#define PW_TOKENIZE_TO_CALLBACK(callback, format, ...) \
- PW_TOKENIZE_TO_CALLBACK_DOMAIN( \
- PW_TOKENIZER_DEFAULT_DOMAIN, callback, format, __VA_ARGS__)
-
-// Same as PW_TOKENIZE_TO_CALLBACK, but tokenizes to the specified domain.
-#define PW_TOKENIZE_TO_CALLBACK_DOMAIN(domain, callback, format, ...) \
- PW_TOKENIZE_TO_CALLBACK_MASK( \
- domain, UINT32_MAX, callback, format, __VA_ARGS__)
-
-// Same as PW_TOKENIZE_TO_CALLBACK_DOMAIN, but applies a mask to the token.
-#define PW_TOKENIZE_TO_CALLBACK_MASK(domain, mask, callback, format, ...) \
- do { \
- PW_TOKENIZE_FORMAT_STRING(domain, mask, format, __VA_ARGS__); \
- _pw_tokenizer_ToCallback(callback, \
- _pw_tokenizer_token, \
- PW_TOKENIZER_ARG_TYPES(__VA_ARGS__) \
- PW_COMMA_ARGS(__VA_ARGS__)); \
- } while (0)
-
PW_EXTERN_C_START
// These functions encode the tokenized strings. These should not be called
@@ -214,12 +167,6 @@
pw_tokenizer_ArgTypes types,
...);
-void _pw_tokenizer_ToCallback(void (*callback)(const uint8_t* encoded_message,
- size_t size_bytes),
- pw_tokenizer_Token token,
- pw_tokenizer_ArgTypes types,
- ...);
-
// This empty function allows the compiler to check the format string.
static inline void pw_tokenizer_CheckFormatString(const char* format, ...)
PW_PRINTF_FORMAT(1, 2);
diff --git a/pw_tokenizer/public/pw_tokenizer/tokenize_to_global_handler.h b/pw_tokenizer/public/pw_tokenizer/tokenize_to_global_handler.h
deleted file mode 100644
index ca7e0b9..0000000
--- a/pw_tokenizer/public/pw_tokenizer/tokenize_to_global_handler.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2020 The Pigweed Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-#pragma once
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "pw_preprocessor/util.h"
-#include "pw_tokenizer/tokenize.h"
-
-// Encodes a tokenized string and arguments to a buffer on the stack. The buffer
-// is passed to the user-defined pw_tokenizer_HandleEncodedMessage function. The
-// size of the stack-allocated argument encoding buffer is set with the
-// PW_TOKENIZER_CFG_ENCODING_BUFFER_SIZE_BYTES option.
-//
-// The macro's arguments are equivalent to the following function signature:
-//
-// TokenizeToGlobalHandler(const char* format,
-// ...); /* printf-style arguments */
-//
-// For example, the following encodes a tokenized string with a value returned
-// from a function call. The encoded message is passed to the caller-defined
-// pw_tokenizer_HandleEncodedMessage function.
-//
-// void OutputLastReadSize() {
-// PW_TOKENIZE_TO_GLOBAL_HANDLER("Read %u bytes", ReadSizeBytes());
-// }
-//
-// void pw_tokenizer_HandleEncodedMessage(const uint8_t encoded_message[],
-// size_t size_bytes) {
-// MyProject_EnqueueMessageForUart(buffer, size_bytes);
-// }
-//
-#define PW_TOKENIZE_TO_GLOBAL_HANDLER(format, ...) \
- PW_TOKENIZE_TO_GLOBAL_HANDLER_DOMAIN( \
- PW_TOKENIZER_DEFAULT_DOMAIN, format, __VA_ARGS__)
-
-// Same as PW_TOKENIZE_TO_GLOBAL_HANDLER, but tokenizes to the specified domain.
-#define PW_TOKENIZE_TO_GLOBAL_HANDLER_DOMAIN(domain, format, ...) \
- PW_TOKENIZE_TO_GLOBAL_HANDLER_MASK(domain, UINT32_MAX, format, __VA_ARGS__)
-
-// Same as PW_TOKENIZE_TO_GLOBAL_HANDLER_DOMAIN, but applies a mask to the
-// token.
-#define PW_TOKENIZE_TO_GLOBAL_HANDLER_MASK(domain, mask, format, ...) \
- do { \
- PW_TOKENIZE_FORMAT_STRING(domain, mask, format, __VA_ARGS__); \
- _pw_tokenizer_ToGlobalHandler(_pw_tokenizer_token, \
- PW_TOKENIZER_ARG_TYPES(__VA_ARGS__) \
- PW_COMMA_ARGS(__VA_ARGS__)); \
- } while (0)
-
-PW_EXTERN_C_START
-
-// This function must be defined by the pw_tokenizer:global_handler backend.
-// This function is called with the encoded message by
-// _pw_tokenizer_ToGlobalHandler.
-void pw_tokenizer_HandleEncodedMessage(const uint8_t encoded_message[],
- size_t size_bytes);
-
-// This function encodes the tokenized strings. Do not call it directly;
-// instead, use the PW_TOKENIZE_TO_GLOBAL_HANDLER macro.
-void _pw_tokenizer_ToGlobalHandler(pw_tokenizer_Token token,
- pw_tokenizer_ArgTypes types,
- ...);
-
-PW_EXTERN_C_END
diff --git a/pw_tokenizer/pw_tokenizer_private/tokenize_test.h b/pw_tokenizer/pw_tokenizer_private/tokenize_test.h
index 3c4b463..49e4bad 100644
--- a/pw_tokenizer/pw_tokenizer_private/tokenize_test.h
+++ b/pw_tokenizer/pw_tokenizer_private/tokenize_test.h
@@ -40,8 +40,6 @@
void pw_tokenizer_ToBufferTest_Requires8(void* buffer, size_t* buffer_size);
-void pw_tokenizer_ToGlobalHandlerTest_SequentialZigZag(void);
-
void pw_tokenizer_ToGlobalHandlerWithPayloadTest_SequentialZigZag(void);
PW_EXTERN_C_END
diff --git a/pw_tokenizer/simple_tokenize_test.cc b/pw_tokenizer/simple_tokenize_test.cc
index 00bf817..8733a62 100644
--- a/pw_tokenizer/simple_tokenize_test.cc
+++ b/pw_tokenizer/simple_tokenize_test.cc
@@ -18,7 +18,6 @@
#include "gtest/gtest.h"
#include "pw_tokenizer/tokenize.h"
-#include "pw_tokenizer/tokenize_to_global_handler.h"
#include "pw_tokenizer/tokenize_to_global_handler_with_payload.h"
namespace pw {
@@ -101,8 +100,6 @@
template <typename Impl>
size_t GlobalMessage<Impl>::message_size_bytes_ = 0;
-class TokenizeToCallback : public GlobalMessage<TokenizeToCallback> {};
-
template <uint8_t... kData, size_t kSize>
std::array<uint8_t, sizeof(uint32_t) + sizeof...(kData)> ExpectedData(
const char (&format)[kSize]) {
@@ -115,36 +112,6 @@
kData...};
}
-TEST_F(TokenizeToCallback, Variety) {
- PW_TOKENIZE_TO_CALLBACK(
- SetMessage, "%s there are %x (%.2f) of them%c", "Now", 2u, 2.0f, '.');
- const auto expected = // clang-format off
- ExpectedData<3, 'N', 'o', 'w', // string "Now"
- 0x04, // unsigned 2 (zig-zag encoded)
- 0x00, 0x00, 0x00, 0x40, // float 2.0
- 0x5C // char '.' (0x2E, zig-zag encoded)
- >("%s there are %x (%.2f) of them%c");
- // clang-format on
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-class TokenizeToGlobalHandler : public GlobalMessage<TokenizeToGlobalHandler> {
-};
-
-TEST_F(TokenizeToGlobalHandler, Variety) {
- PW_TOKENIZE_TO_GLOBAL_HANDLER("%x%lld%1.2f%s", 0, 0ll, -0.0, "");
- const auto expected =
- ExpectedData<0, 0, 0x00, 0x00, 0x00, 0x80, 0>("%x%lld%1.2f%s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-extern "C" void pw_tokenizer_HandleEncodedMessage(
- const uint8_t* encoded_message, size_t size_bytes) {
- TokenizeToGlobalHandler::SetMessage(encoded_message, size_bytes);
-}
-
class TokenizeToGlobalHandlerWithPayload
: public GlobalMessage<TokenizeToGlobalHandlerWithPayload> {
public:
diff --git a/pw_tokenizer/tokenize.cc b/pw_tokenizer/tokenize.cc
index 5206fcd..5bed3fc 100644
--- a/pw_tokenizer/tokenize.cc
+++ b/pw_tokenizer/tokenize.cc
@@ -87,18 +87,5 @@
*buffer_size_bytes = sizeof(token) + encoded_bytes;
}
-extern "C" void _pw_tokenizer_ToCallback(
- void (*callback)(const uint8_t* encoded_message, size_t size_bytes),
- Token token,
- pw_tokenizer_ArgTypes types,
- ...) {
- va_list args;
- va_start(args, types);
- EncodedMessage encoded(token, types, args);
- va_end(args);
-
- callback(encoded.data_as_uint8(), encoded.size());
-}
-
} // namespace tokenizer
} // namespace pw
diff --git a/pw_tokenizer/tokenize_test.cc b/pw_tokenizer/tokenize_test.cc
index 0a1837f..8efbba4 100644
--- a/pw_tokenizer/tokenize_test.cc
+++ b/pw_tokenizer/tokenize_test.cc
@@ -540,91 +540,6 @@
EXPECT_EQ(std::memcmp(expected.data(), buffer_, expected.size()), 0);
}
-class TokenizeToCallback : public ::testing::Test {
- public:
- static void SetMessage(const uint8_t* message, size_t size) {
- ASSERT_LE(size, sizeof(message_));
- std::memcpy(message_, message, size);
- message_size_bytes_ = size;
- }
-
- protected:
- TokenizeToCallback() {
- std::memset(message_, 0, sizeof(message_));
- message_size_bytes_ = 0;
- }
-
- static uint8_t message_[256];
- static size_t message_size_bytes_;
-};
-
-uint8_t TokenizeToCallback::message_[256] = {};
-size_t TokenizeToCallback::message_size_bytes_ = 0;
-
-TEST_F(TokenizeToCallback, Variety) {
- PW_TOKENIZE_TO_CALLBACK(
- SetMessage, "%s there are %x (%.2f) of them%c", "Now", 2u, 2.0f, '.');
- const auto expected = // clang-format off
- ExpectedData<3, 'N', 'o', 'w', // string "Now"
- 0x04, // unsigned 2 (zig-zag encoded)
- 0x00, 0x00, 0x00, 0x40, // float 2.0
- 0x5C // char '.' (0x2E, zig-zag encoded)
- >("%s there are %x (%.2f) of them%c");
- // clang-format on
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, Strings) {
- PW_TOKENIZE_TO_CALLBACK(SetMessage, "The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, Domain_Strings) {
- PW_TOKENIZE_TO_CALLBACK_DOMAIN(
- "TEST_DOMAIN", SetMessage, "The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s");
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, Mask) {
- PW_TOKENIZE_TO_CALLBACK_MASK(
- "TEST_DOMAIN", 0x00000FFF, SetMessage, "The answer is: %s", "5432!");
- constexpr std::array<uint8_t, 10> expected =
- ExpectedData<5, '5', '4', '3', '2', '!'>("The answer is: %s", 0x00000FFF);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, CharArray) {
- PW_TOKENIZE_TO_CALLBACK(SetMessage, __func__);
- constexpr auto expected = ExpectedData(__func__);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, C_SequentialZigZag) {
- pw_tokenizer_ToCallbackTest_SequentialZigZag(SetMessage);
-
- constexpr std::array<uint8_t, 18> expected =
- ExpectedData<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13>(
- TEST_FORMAT_SEQUENTIAL_ZIG_ZAG);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
-TEST_F(TokenizeToCallback, AsArgumentToAnotherMacro) {
- MACRO_THAT_CALLS_ANOTHER_MACRO(PW_TOKENIZE_TO_CALLBACK(SetMessage, __func__));
- constexpr auto expected = ExpectedData(__func__);
- ASSERT_EQ(expected.size(), message_size_bytes_);
- EXPECT_EQ(std::memcmp(expected.data(), message_, expected.size()), 0);
-}
-
#undef MACRO_THAT_CALLS_ANOTHER_MACRO
#undef ANOTHER_MACRO
@@ -659,26 +574,5 @@
EXPECT_STREQ(string_literal, "The answer is: %s");
}
-TEST_F(TokenizeToCallback, Domain_Default) {
- const char* tokenizer_domain = nullptr;
- const char* string_literal = nullptr;
-
- PW_TOKENIZE_TO_CALLBACK(SetMessage, "The answer is: %s", "5432!");
-
- EXPECT_STREQ(tokenizer_domain, PW_TOKENIZER_DEFAULT_DOMAIN);
- EXPECT_STREQ(string_literal, "The answer is: %s");
-}
-
-TEST_F(TokenizeToCallback, Domain_Specified) {
- const char* tokenizer_domain = nullptr;
- const char* string_literal = nullptr;
-
- PW_TOKENIZE_TO_CALLBACK_DOMAIN(
- "ThisIsTheDomain", SetMessage, "The answer is: %s", "5432!");
-
- EXPECT_STREQ(tokenizer_domain, "ThisIsTheDomain");
- EXPECT_STREQ(string_literal, "The answer is: %s");
-}
-
} // namespace
} // namespace pw::tokenizer
diff --git a/pw_tokenizer/tokenize_test_c.c b/pw_tokenizer/tokenize_test_c.c
index bf8877a..485bb50 100644
--- a/pw_tokenizer/tokenize_test_c.c
+++ b/pw_tokenizer/tokenize_test_c.c
@@ -53,26 +53,6 @@
(signed char)-7);
}
-void pw_tokenizer_ToCallbackTest_SequentialZigZag(
- void (*callback)(const uint8_t* buffer, size_t size)) {
- PW_TOKENIZE_TO_CALLBACK(callback,
- TEST_FORMAT_SEQUENTIAL_ZIG_ZAG,
- 0u,
- -1,
- 1u,
- (unsigned)-2,
- (unsigned short)2u,
- (signed char)-3,
- 3,
- -4l,
- 4ul,
- -5ll,
- 5ull,
- (signed char)-6,
- (char)6,
- (signed char)-7);
-}
-
void pw_tokenizer_ToBufferTest_Requires8(void* buffer, size_t* buffer_size) {
PW_TOKENIZE_TO_BUFFER(buffer, buffer_size, TEST_FORMAT_REQUIRES_8, "hi", -7);
}
diff --git a/pw_tokenizer/tokenize_to_global_handler.cc b/pw_tokenizer/tokenize_to_global_handler.cc
deleted file mode 100644
index 5ac2755..0000000
--- a/pw_tokenizer/tokenize_to_global_handler.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2020 The Pigweed Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#include "pw_tokenizer/tokenize_to_global_handler.h"
-
-#include "pw_tokenizer/encode_args.h"
-
-namespace pw {
-namespace tokenizer {
-
-extern "C" void _pw_tokenizer_ToGlobalHandler(pw_tokenizer_Token token,
- pw_tokenizer_ArgTypes types,
- ...) {
- va_list args;
- va_start(args, types);
- EncodedMessage encoded(token, types, args);
- va_end(args);
-
- pw_tokenizer_HandleEncodedMessage(encoded.data_as_uint8(), encoded.size());
-}
-
-} // namespace tokenizer
-} // namespace pw