|  | /* | 
|  | * Copyright (c) 2019 Intel corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <string.h> | 
|  | #include <zephyr/sys/cbprintf.h> | 
|  | #include <tracing_buffer.h> | 
|  | #include <tracing_format_common.h> | 
|  |  | 
|  | static int str_put(int c, void *ctx) | 
|  | { | 
|  | tracing_ctx_t *str_ctx = (tracing_ctx_t *)ctx; | 
|  |  | 
|  | if (str_ctx->status == 0) { | 
|  | uint8_t *buf; | 
|  | uint32_t claimed_size; | 
|  |  | 
|  | claimed_size = tracing_buffer_put_claim(&buf, 1); | 
|  | if (claimed_size) { | 
|  | *buf = (uint8_t)c; | 
|  | str_ctx->length++; | 
|  | } else { | 
|  | str_ctx->status = -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | bool tracing_format_string_put(const char *str, va_list args) | 
|  | { | 
|  | tracing_ctx_t str_ctx = {0}; | 
|  |  | 
|  | (void)cbvprintf(str_put, (void *)&str_ctx, str, args); | 
|  |  | 
|  | if (str_ctx.status == 0) { | 
|  | tracing_buffer_put_finish(str_ctx.length); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | tracing_buffer_put_finish(0); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool tracing_format_raw_data_put(uint8_t *data, uint32_t size) | 
|  | { | 
|  | uint32_t space = tracing_buffer_space_get(); | 
|  |  | 
|  | if (space >= size) { | 
|  | tracing_buffer_put(data, size); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool tracing_format_data_put(tracing_data_t *tracing_data_array, uint32_t count) | 
|  | { | 
|  | uint32_t total_size = 0U; | 
|  |  | 
|  | for (uint32_t i = 0; i < count; i++) { | 
|  | tracing_data_t *tracing_data = | 
|  | tracing_data_array + i; | 
|  | uint8_t *data = tracing_data->data, *buf; | 
|  | uint32_t length = tracing_data->length, claimed_size; | 
|  |  | 
|  | do { | 
|  | claimed_size = tracing_buffer_put_claim(&buf, length); | 
|  | memcpy(buf, data, claimed_size); | 
|  | total_size += claimed_size; | 
|  | length -= claimed_size; | 
|  | data += claimed_size; | 
|  | } while (length && claimed_size); | 
|  |  | 
|  | if (length && claimed_size == 0) { | 
|  | tracing_buffer_put_finish(0); | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | tracing_buffer_put_finish(total_size); | 
|  | return true; | 
|  | } |