1 // Copyright 2021 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_BASE_STRINGS_H_
6 #define V8_BASE_STRINGS_H_
7 
8 #include "src/base/base-export.h"
9 #include "src/base/macros.h"
10 #include "src/base/vector.h"
11 
12 namespace v8 {
13 namespace base {
14 
15 // Latin1/UTF-16 constants
16 // Code-point values in Unicode 4.0 are 21 bits wide.
17 // Code units in UTF-16 are 16 bits wide.
18 using uc16 = uint16_t;
19 using uc32 = uint32_t;
20 constexpr int kUC16Size = sizeof(uc16);
21 
22 V8_BASE_EXPORT int PRINTF_FORMAT(2, 0)
23     VSNPrintF(Vector<char> str, const char* format, va_list args);
24 
25 // Safe formatting print. Ensures that str is always null-terminated.
26 // Returns the number of chars written, or -1 if output was truncated.
27 V8_BASE_EXPORT int PRINTF_FORMAT(2, 3)
28     SNPrintF(Vector<char> str, const char* format, ...);
29 
30 V8_BASE_EXPORT void StrNCpy(base::Vector<char> dest, const char* src, size_t n);
31 
32 // Returns the value (0 .. 15) of a hexadecimal character c.
33 // If c is not a legal hexadecimal character, returns a value < 0.
HexValue(uc32 c)34 inline int HexValue(uc32 c) {
35   c -= '0';
36   if (static_cast<unsigned>(c) <= 9) return c;
37   c = (c | 0x20) - ('a' - '0');  // detect 0x11..0x16 and 0x31..0x36.
38   if (static_cast<unsigned>(c) <= 5) return c + 10;
39   return -1;
40 }
41 
HexCharOfValue(int value)42 inline char HexCharOfValue(int value) {
43   DCHECK(0 <= value && value <= 16);
44   if (value < 10) return value + '0';
45   return value - 10 + 'A';
46 }
47 
48 }  // namespace base
49 }  // namespace v8
50 
51 #endif  // V8_BASE_STRINGS_H_
52