1
0
Эх сурвалжийг харах

string: Add new HEX sub-command

Kyle Edwards 5 жил өмнө
parent
commit
5395bf05eb

+ 11 - 0
Help/command/string.rst

@@ -36,6 +36,7 @@ Synopsis
 
   `Generation`_
     string(`ASCII`_ <number>... <out-var>)
+    string(`HEX`_ <string> <out-var>)
     string(`CONFIGURE`_ <string> <out-var> [...])
     string(`MAKE_C_IDENTIFIER`_ <string> <out-var>)
     string(`RANDOM`_ [<option>...] <out-var>)
@@ -355,6 +356,16 @@ Generation
 
 Convert all numbers into corresponding ASCII characters.
 
+.. _HEX:
+
+.. code-block:: cmake
+
+  string(HEX <string> <output_variable>)
+
+Convert each byte in the input ``<string>`` to its hexadecimal representation
+and store the concatenated hex digits in the ``<output_variable>``. Letters in
+the output (``a`` through ``f``) are in lowercase.
+
 .. _CONFIGURE:
 
 .. code-block:: cmake

+ 5 - 0
Help/release/dev/string-hex.rst

@@ -0,0 +1,5 @@
+string-hex
+----------
+
+* The :command:`string` command learned a new ``HEX`` sub-command, which
+  converts strings into their hexadecimal representation.

+ 22 - 0
Source/cmStringCommand.cxx

@@ -124,6 +124,27 @@ bool HandleAsciiCommand(std::vector<std::string> const& args,
   return true;
 }
 
+bool HandleHexCommand(std::vector<std::string> const& args,
+                      cmExecutionStatus& status)
+{
+  if (args.size() != 3) {
+    status.SetError("Incorrect number of arguments");
+    return false;
+  }
+  auto const& instr = args[1];
+  auto const& outvar = args[2];
+  std::string output(instr.size() * 2, ' ');
+
+  std::string::size_type hexIndex = 0;
+  for (auto const& c : instr) {
+    sprintf(&output[hexIndex], "%.2x", static_cast<unsigned char>(c) & 0xFF);
+    hexIndex += 2;
+  }
+
+  status.GetMakefile().AddDefinition(outvar, output);
+  return true;
+}
+
 bool HandleConfigureCommand(std::vector<std::string> const& args,
                             cmExecutionStatus& status)
 {
@@ -936,6 +957,7 @@ bool cmStringCommand(std::vector<std::string> const& args,
     { "TOUPPER"_s, HandleToUpperCommand },
     { "COMPARE"_s, HandleCompareCommand },
     { "ASCII"_s, HandleAsciiCommand },
+    { "HEX"_s, HandleHexCommand },
     { "CONFIGURE"_s, HandleConfigureCommand },
     { "LENGTH"_s, HandleLengthCommand },
     { "APPEND"_s, HandleAppendCommand },

+ 20 - 0
Tests/RunCMake/string/Hex.cmake

@@ -0,0 +1,20 @@
+function(assert_strequal input actual expected)
+  if(NOT expected STREQUAL actual)
+    message(SEND_ERROR "Output did not match expected\nInput string:\n  ${input}\nExpected:\n  ${expected}\nActual:\n  ${actual}")
+  endif()
+endfunction()
+
+set(_input1 "The quick brown fox jumps over the lazy dog.")
+string(HEX "${_input1}" _result1)
+assert_strequal("${_input1}" "${_result1}" "54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f672e")
+
+set(_input2 "Hello world!")
+string(HEX "${_input2}" _result2)
+assert_strequal("${_input2}" "${_result2}" "48656c6c6f20776f726c6421")
+
+set(_input3 "Ash nazg durbatulûk\nAsh nazg gimbatul\nAsh nazg thrakatulûk\nAgh burzum-ishi krimpatul")
+string(HEX "${_input3}" _result3)
+assert_strequal("${_input3}" "${_result3}" "417368206e617a6720647572626174756cc3bb6b0a417368206e617a672067696d626174756c0a417368206e617a6720746872616b6174756cc3bb6b0a416768206275727a756d2d69736869206b72696d706174756c")
+
+string(HEX "" _result_empty)
+assert_strequal("" "${_result_empty}" "")

+ 1 - 0
Tests/RunCMake/string/HexNotEnoughArgs-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/string/HexNotEnoughArgs-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at HexNotEnoughArgs\.cmake:[0-9]+ \(string\):
+  string Incorrect number of arguments
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 1 - 0
Tests/RunCMake/string/HexNotEnoughArgs.cmake

@@ -0,0 +1 @@
+string(HEX "Hello world!")

+ 1 - 0
Tests/RunCMake/string/HexTooManyArgs-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/string/HexTooManyArgs-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at HexTooManyArgs\.cmake:[0-9]+ \(string\):
+  string Incorrect number of arguments
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 1 - 0
Tests/RunCMake/string/HexTooManyArgs.cmake

@@ -0,0 +1 @@
+string(HEX "Hello world!" _output bad)

+ 4 - 0
Tests/RunCMake/string/RunCMakeTest.cmake

@@ -37,3 +37,7 @@ run_cmake(UTF-32LE)
 run_cmake(Repeat)
 run_cmake(RepeatNoArgs)
 run_cmake(RepeatNegativeCount)
+
+run_cmake(Hex)
+run_cmake(HexTooManyArgs)
+run_cmake(HexNotEnoughArgs)