MySQL 9.6.0
Source Code Documentation
hex_basic.h
Go to the documentation of this file.
1// Copyright (c) 2025, Oracle and/or its affiliates.
2//
3// This program is free software; you can redistribute it and/or modify
4// it under the terms of the GNU General Public License, version 2.0,
5// as published by the Free Software Foundation.
6//
7// This program is designed to work with certain software (including
8// but not limited to OpenSSL) that is licensed under separate terms,
9// as designated in a particular file or component or in included license
10// documentation. The authors of MySQL hereby grant you an additional
11// permission to link the program and your derivative works with the
12// separately licensed software that they have either included with
13// the program or referenced in the documentation.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License, version 2.0, for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
24#ifndef MYSQL_STRCONV_CONV_HEX_BASIC_H
25#define MYSQL_STRCONV_CONV_HEX_BASIC_H
26
27/// @file
28/// Experimental API header
29
30#include <string_view> // string_view
31#include "mysql/meta/is_specialization.h" // Is_nontype_specialization
32#include "mysql/strconv/decode/parser.h" // Parser
33#include "mysql/strconv/encode/string_target.h" // Is_string_target
34#include "mysql/strconv/formats/hex_format.h" // Hex_format
35
36/// @addtogroup GroupLibsMysqlStrconv
37/// @{
38
39namespace mysql::strconv {
40
41// ==== Format strings into hex format ====
42
43/// Format the given char buffer in hex format.
44///
45/// @param format Type tag to identify that this relates to hex format.
46///
47/// @param[out] target Target object to which the string will be written.
48///
49/// @param sv Input string.
50template <Is_string_target Target_t>
53 Target_t &target, const std::string_view &sv) {
54 if constexpr (Target_t::target_type == Target_type::counter) {
55 target.advance(2 * sv.size());
56 } else {
57 for (unsigned char ch : sv) {
58 target.write_char(format.int_to_hex(ch >> 4));
59 target.write_char(format.int_to_hex(ch & 0xf));
60 }
61 }
62}
63
64// ==== Parse strings from hex format ====
65
66/// Read into a single character from a string of two hex digits.
67///
68/// @param format Type tag to identify that this is hex format. Also holds the
69/// minimum and maximum allowed length of the resulting plaintext string.
70///
71/// @param[in,out] parser reference to Parser
72///
73/// @param target String target object to write to.
76 Parser &parser, Is_string_target auto &target) {
77 if (parser.remaining_size() < 2) {
78 parser.set_parse_error("Expected at least two hex digits");
79 return;
80 }
81 auto hi = format.hex_to_int(*parser.upos());
82 if (hi == -1) {
83 parser.set_parse_error("Expected hex digit");
84 return;
85 }
86 ++parser;
87
88 auto lo = format.hex_to_int(*parser.upos());
89 if (lo == -1) {
90 parser.set_parse_error("Expected hex digit");
91 return;
92 }
93 ++parser;
94
95 target.write_char((hi << 4) + lo);
96}
97
98} // namespace mysql::strconv
99
100// addtogroup GroupLibsMysqlStrconv
101/// @}
102
103#endif // ifndef MYSQL_STRCONV_CONV_HEX_BASIC_H
Object used to parse strings.
Definition: parser.h:69
void set_parse_error(const std::string_view &message)
Store a result representing that the requested object could not be parsed because the string is wrong...
Definition: parser.h:94
std::size_t remaining_size() const
Return the remaining size.
Definition: parse_position.h:153
const unsigned char * upos() const
Return the current position as an unsigned char pointer.
Definition: parse_position.h:113
Concept used to determine at compile time whether a given type Test is a template specialization of t...
Definition: is_specialization.h:75
Concept that holds for String_counter and String_writer.
Definition: string_target.h:111
Experimental API header.
Experimental API header.
struct Parser parser
std::string format(const routing_guidelines::Session_info &session_info, bool extended_session_info)
Definition: dest_metadata_cache.cc:170
Definition: gtid_binary_format.h:41
void decode_impl(const Gtid_binary_format &format, Parser &parser, mysql::gtids::Is_tag auto &tag)
Definition: gtid_binary_format_conv.h:63
void encode_impl(const Gtid_binary_format &format, Is_string_target auto &target, const mysql::gtids::Is_tag auto &tag)
Definition: gtid_binary_format_conv.h:48
Experimental API header.
Experimental API header.