clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / src / common / buffer-view.cpp
CommitLineData
01dc0eed 1/*
ab5be9fa 2 * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
01dc0eed 3 *
ab5be9fa 4 * SPDX-License-Identifier: LGPL-2.1-only
01dc0eed 5 *
01dc0eed
JG
6 */
7
c9e313bc
SM
8#include <common/buffer-view.hpp>
9#include <common/dynamic-buffer.hpp>
10#include <common/error.hpp>
01dc0eed 11
28ab034a 12struct lttng_buffer_view lttng_buffer_view_init(const char *src, size_t offset, ptrdiff_t len)
b35aac84 13{
a6bc4ca9 14 struct lttng_buffer_view view = { .data = src + offset, .size = (size_t) len };
b35aac84
JG
15 return view;
16}
17
3e6e0df2
JG
18bool lttng_buffer_view_is_valid(const struct lttng_buffer_view *view)
19{
20 return view && view->data && view->size > 0;
21}
22
28ab034a
JG
23struct lttng_buffer_view
24lttng_buffer_view_from_view(const struct lttng_buffer_view *src, size_t offset, ptrdiff_t len)
01dc0eed 25{
cd9adb8b 26 struct lttng_buffer_view view = { .data = nullptr, .size = 0 };
01dc0eed 27
a0377dfe 28 LTTNG_ASSERT(src);
01dc0eed
JG
29
30 if (offset > src->size) {
df62dbcd 31 ERR("Attempt to create buffer view from another view with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd",
28ab034a
JG
32 src->size,
33 offset,
34 len);
01dc0eed
JG
35 goto end;
36 }
37
38 if (len != -1 && len > (src->size - offset)) {
df62dbcd 39 ERR("Attempt to create buffer view from another view with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd",
28ab034a
JG
40 src->size,
41 offset,
42 len);
01dc0eed
JG
43 goto end;
44 }
45
46 view.data = src->data + offset;
47 view.size = len == -1 ? (src->size - offset) : len;
48end:
49 return view;
50}
51
52struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer(
28ab034a 53 const struct lttng_dynamic_buffer *src, size_t offset, ptrdiff_t len)
01dc0eed 54{
cd9adb8b 55 struct lttng_buffer_view view = { .data = nullptr, .size = 0 };
01dc0eed 56
a0377dfe 57 LTTNG_ASSERT(src);
01dc0eed
JG
58
59 if (offset > src->size) {
df62dbcd 60 ERR("Attempt to create buffer view from a dynamic buffer with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd",
28ab034a
JG
61 src->size,
62 offset,
63 len);
01dc0eed
JG
64 goto end;
65 }
66
67 if (len != -1 && len > (src->size - offset)) {
df62dbcd 68 ERR("Attempt to create buffer view from a dynamic buffer with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd",
28ab034a
JG
69 src->size,
70 offset,
71 len);
01dc0eed
JG
72 goto end;
73 }
74
75 view.data = src->data + offset;
76 view.size = len == -1 ? (src->size - offset) : len;
77end:
78 return view;
79}
67d8e2ef 80
67d8e2ef 81bool lttng_buffer_view_contains_string(const struct lttng_buffer_view *buf,
28ab034a
JG
82 const char *str,
83 size_t len_with_null_terminator)
67d8e2ef
SM
84{
85 const char *past_buf_end;
86 size_t max_str_len_with_null_terminator;
87 size_t str_len;
88 bool ret;
89
90 past_buf_end = buf->data + buf->size;
91
92 /* Is the start of the string in the buffer view? */
93 if (str < buf->data || str >= past_buf_end) {
94 ret = false;
95 goto end;
96 }
97
98 /*
99 * Max length the string could have to fit in the buffer, including
100 * NULL terminator.
101 */
102 max_str_len_with_null_terminator = past_buf_end - str;
103
104 /* Could the string even fit in the buffer? */
105 if (len_with_null_terminator > max_str_len_with_null_terminator) {
106 ret = false;
107 goto end;
108 }
109
110 str_len = lttng_strnlen(str, max_str_len_with_null_terminator);
111 if (str_len != (len_with_null_terminator - 1)) {
112 ret = false;
113 goto end;
114 }
115
116 ret = true;
117
118end:
119 return ret;
120}
This page took 0.053486 seconds and 4 git commands to generate.