diff options
author | Martin Willers <M.Willers@gmx.net> | 2020-04-21 17:15:30 +0200 |
---|---|---|
committer | Saya Sugiura <39760799+ssugiura@users.noreply.github.com> | 2020-05-18 08:21:27 +0900 |
commit | 1e414546eaf2049136af33029b9e6df8356fce95 (patch) | |
tree | 9c4f51975dcc8e1167f6ff2d675876970eb6b7fa | |
parent | 179150f7d52abbb1d923da0c35d4a715ade382b0 (diff) | |
download | DLT-daemon-1e414546eaf2049136af33029b9e6df8356fce95.tar.gz |
Add helper function for writing strings with known sizes
This use case is common in C++ code nowadays, due to the usage of e.g.
std::string_view, which does not provide a function for retrieving a
null-terminated C-string, but which provides quick access to the string
length via std::string_view::size().
Such use cases can now avoid an entirely unnecessary strlen() call.
Signed-off-by: Martin Willers <M.Willers@gmx.net>
-rw-r--r-- | src/lib/dlt_user.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 511f991..9c9734f 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -175,6 +175,9 @@ static void dlt_fork_child_fork_handler(); static DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char *text, const enum StringType type); +static DltReturnValue dlt_user_log_write_sized_string_utils(DltContextData *log, const char *text, + uint16_t text_len, const enum StringType type); + DltReturnValue dlt_user_check_library_version(const char *user_major_version, const char *user_minor_version) { @@ -2341,7 +2344,7 @@ DltReturnValue dlt_user_log_write_utf8_string(DltContextData *log, const char *t return dlt_user_log_write_string_utils(log, text, UTF8_STRING); } -DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char *text, const enum StringType type) +DltReturnValue dlt_user_log_write_sized_string_utils(DltContextData *log, const char *text, uint16_t length, const enum StringType type) { uint16_t arg_size = 0; uint32_t type_info = 0; @@ -2359,7 +2362,7 @@ DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char * return DLT_RETURN_ERROR; } - arg_size = strlen(text) + 1; + arg_size = length + 1; new_log_size = log->size + arg_size + sizeof(uint16_t); @@ -2445,7 +2448,9 @@ DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char * case DLT_RETURN_OK: { /* Whole string will be copied */ - memcpy((log->buffer) + log->size, text, arg_size); + memcpy((log->buffer) + log->size, text, length); + /* The input string might not be null-terminated, so we're doing that by ourselves */ + log->buffer[log->size + length] = '\0'; log->size += arg_size; break; } @@ -2472,6 +2477,15 @@ DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char * return ret; } +DltReturnValue dlt_user_log_write_string_utils(DltContextData *log, const char *text, const enum StringType type) +{ + if ((log == NULL) || (text == NULL)) + return DLT_RETURN_WRONG_PARAMETER; + + uint16_t length = strlen(text); + return dlt_user_log_write_sized_string_utils(log, text, length, type); +} + DltReturnValue dlt_register_injection_callback_with_id(DltContext *handle, uint32_t service_id, dlt_injection_callback_id dlt_injection_cbk, void *priv) { |