1 | //===-- string_utils.h ------------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef SCUDO_STRING_UTILS_H_ |
10 | #define SCUDO_STRING_UTILS_H_ |
11 | |
12 | #include "internal_defs.h" |
13 | #include "vector.h" |
14 | |
15 | #include <stdarg.h> |
16 | |
17 | namespace scudo { |
18 | |
19 | class ScopedString { |
20 | public: |
21 | explicit ScopedString() { String.push_back(Element: '\0'); } |
22 | uptr length() { return String.size() - 1; } |
23 | const char *data() { return String.data(); } |
24 | void clear() { |
25 | String.clear(); |
26 | String.push_back(Element: '\0'); |
27 | } |
28 | void vappend(const char *Format, va_list &Args); |
29 | void append(const char *Format, ...) FORMAT(2, 3); |
30 | void output() const { outputRaw(Buffer: String.data()); } |
31 | void reserve(size_t Size) { String.reserve(NewSize: Size + 1); } |
32 | uptr capacity() { return String.capacity() - 1; } |
33 | |
34 | private: |
35 | void appendNumber(u64 AbsoluteValue, u8 Base, u8 MinNumberLength, |
36 | bool PadWithZero, bool Negative, bool Upper); |
37 | void appendUnsigned(u64 Num, u8 Base, u8 MinNumberLength, bool PadWithZero, |
38 | bool Upper); |
39 | void appendSignedDecimal(s64 Num, u8 MinNumberLength, bool PadWithZero); |
40 | void appendString(int Width, int MaxChars, const char *S); |
41 | void appendPointer(u64 ptr_value); |
42 | |
43 | Vector<char> String; |
44 | }; |
45 | |
46 | void Printf(const char *Format, ...) FORMAT(1, 2); |
47 | |
48 | } // namespace scudo |
49 | |
50 | #endif // SCUDO_STRING_UTILS_H_ |
51 | |