cmake: escape json input string
Escape the json input string given to `to_yaml()` function and the content given to `yaml_set()` function. This ensures that a string like `foo\bar` becomes `foo\\bar` during internal CMake json processing and when written to the file it becomes `foo\bar`. Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
This commit is contained in:
parent
45b85bd220
commit
cdbe424eca
2 changed files with 26 additions and 4 deletions
|
@ -3037,6 +3037,16 @@ endfunction()
|
||||||
# This function extends the CMake string function by providing additional
|
# This function extends the CMake string function by providing additional
|
||||||
# manipulation arguments to CMake string.
|
# manipulation arguments to CMake string.
|
||||||
#
|
#
|
||||||
|
# ESCAPE: Ensure that any single '\' in the input string is escaped with the
|
||||||
|
# escape char '\'. For example the string 'foo\bar' will be escaped
|
||||||
|
# so that it becomes 'foo\\bar'.
|
||||||
|
# Backslashes which are already escaped will not be escaped further,
|
||||||
|
# for example 'foo\\bar' will not be modified.
|
||||||
|
# This is useful for handling of windows path separator in strings or
|
||||||
|
# when strings contains newline escapes such as '\n' and this can
|
||||||
|
# cause issues when writing to a file where a '\n' is desired in the
|
||||||
|
# string instead of a newline.
|
||||||
|
#
|
||||||
# SANITIZE: Ensure that the output string does not contain any special
|
# SANITIZE: Ensure that the output string does not contain any special
|
||||||
# characters. Special characters, such as -, +, =, $, etc. are
|
# characters. Special characters, such as -, +, =, $, etc. are
|
||||||
# converted to underscores '_'.
|
# converted to underscores '_'.
|
||||||
|
@ -3048,9 +3058,11 @@ endfunction()
|
||||||
#
|
#
|
||||||
# returns the updated string
|
# returns the updated string
|
||||||
function(zephyr_string)
|
function(zephyr_string)
|
||||||
set(options SANITIZE TOUPPER)
|
set(options SANITIZE TOUPPER ESCAPE)
|
||||||
cmake_parse_arguments(ZEPHYR_STRING "${options}" "" "" ${ARGN})
|
cmake_parse_arguments(ZEPHYR_STRING "${options}" "" "" ${ARGN})
|
||||||
|
|
||||||
|
zephyr_check_flags_exclusive(${CMAKE_CURRENT_FUNCTION} ZEPHYR_STRING SANITIZE ESCAPE)
|
||||||
|
|
||||||
if (NOT ZEPHYR_STRING_UNPARSED_ARGUMENTS)
|
if (NOT ZEPHYR_STRING_UNPARSED_ARGUMENTS)
|
||||||
message(FATAL_ERROR "Function zephyr_string() called without a return variable")
|
message(FATAL_ERROR "Function zephyr_string() called without a return variable")
|
||||||
endif()
|
endif()
|
||||||
|
@ -3068,6 +3080,13 @@ function(zephyr_string)
|
||||||
string(TOUPPER ${work_string} work_string)
|
string(TOUPPER ${work_string} work_string)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(ZEPHYR_STRING_ESCAPE)
|
||||||
|
# If a single '\' is discovered, such as 'foo\bar', then it must be escaped like: 'foo\\bar'
|
||||||
|
# \\1 and \\2 are keeping the match patterns, the \\\\ --> \\ meaning an escaped '\',
|
||||||
|
# which then becomes a single '\' in the final string.
|
||||||
|
string(REGEX REPLACE "([^\\][\\])([^\\])" "\\1\\\\\\2" work_string "${ZEPHYR_STRING_UNPARSED_ARGUMENTS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(${return_arg} ${work_string} PARENT_SCOPE)
|
set(${return_arg} ${work_string} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
|
@ -422,9 +422,11 @@ function(yaml_set)
|
||||||
internal_yaml_list_initializer(json_string ${genex})
|
internal_yaml_list_initializer(json_string ${genex})
|
||||||
string(JSON json_content SET "${json_content}" ${ARG_YAML_KEY} "${json_string}")
|
string(JSON json_content SET "${json_content}" ${ARG_YAML_KEY} "${json_string}")
|
||||||
endif()
|
endif()
|
||||||
internal_yaml_list_append(json_content ${genex} "${ARG_YAML_KEY}" ${ARG_YAML_LIST})
|
zephyr_string(ESCAPE escape_list "${ARG_YAML_LIST}")
|
||||||
|
internal_yaml_list_append(json_content ${genex} "${ARG_YAML_KEY}" ${escape_list})
|
||||||
else()
|
else()
|
||||||
string(JSON json_content SET "${json_content}" ${ARG_YAML_KEY} "\"${ARG_YAML_VALUE}\"")
|
zephyr_string(ESCAPE escape_value "${ARG_YAML_VALUE}")
|
||||||
|
string(JSON json_content SET "${json_content}" ${ARG_YAML_KEY} "\"${escape_value}\"")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
zephyr_set(JSON "${json_content}" SCOPE ${ARG_YAML_NAME})
|
zephyr_set(JSON "${json_content}" SCOPE ${ARG_YAML_NAME})
|
||||||
|
@ -539,7 +541,8 @@ function(yaml_save)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(to_yaml json level yaml genex)
|
function(to_yaml in_json level yaml genex)
|
||||||
|
zephyr_string(ESCAPE json "${in_json}")
|
||||||
if(level GREATER 0)
|
if(level GREATER 0)
|
||||||
math(EXPR level_dec "${level} - 1")
|
math(EXPR level_dec "${level} - 1")
|
||||||
set(indent_${level} "${indent_${level_dec}} ")
|
set(indent_${level} "${indent_${level_dec}} ")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue