#------------------------------------------------------------------------------- # Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # #------------------------------------------------------------------------------- include_guard() #[===[.rst: RFC 4122 compatible UUID manipulation routines --------------------------------------------- The functionality in this file allows manipulating (which mostly means conversion) of UUID strings to various formats used in the TS build system. #]===] #[===[.rst: .. cmake:command:: uuid_canon_to_octets .. code-block:: cmake uuid_canon_to_octets(UUID RES ) Convert a canonical UUID string to list of bytes, where each byte is represented as a two digit hex octet without any prefix of suffix. Order of bytes will match the order of octets in the canonical string left to right. INPUTS: ``UUID`` Canonical UUID string. OUTPUTS: ``RES`` Name of variable to store the result to. The result is a list of strings, where each list item is a two digit hex digit, without any prefix or suffix. #]===] function(uuid_canon_to_octets) set(options) set(oneValueArgs UUID RES) set(multiValueArgs) cmake_parse_arguments(_MY_PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) check_args(UUID RES) string(REGEX MATCHALL "([A-Za-z0-9][A-Za-z0-9])" _hex_bytes "${_MY_PARAMS_UUID}") list(LENGTH _hex_bytes _len) if(NOT _len EQUAL 16) message(FATAL_ERROR "Failed to convert UUID \"${_MY_PARAMS_UUID}\" to bytes. Failed to get exactly 16 octets.") endif() set(${_MY_PARAMS_RES} ${_hex_bytes} PARENT_SCOPE) endfunction() #[===[.rst: .. cmake:command:: uuid_canon_to_fields .. code-block:: cmake uuid_canon_to_fields(UUID TIME_LOW TIME_MID TIME_HI_AND_VER CLOCK_AND_SEQ ) Convert a canonical UUID string to UUID fields. Each field is a INPUTS: ``UUID`` Canonical UUID string. OUTPUTS: ``TIME_LOW`` Name of variable to store the time low filed. ``TIME_MID`` Name of variable to store the time mid filed. ``TIME_HI_AND_VER`` Name of variable to store the time hi and version filed. ``CLOCK_AND_SEQ`` Name of variable to store the clock and sequence filed. #]===] function(uuid_canon_to_fields) set(options) set(oneValueArgs UUID TIME_LOW TIME_MID TIME_HI_AND_VER CLOCK_AND_SEQ) set(multiValueArgs) cmake_parse_arguments(_MY_PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) check_args(UUID TIME_LOW TIME_MID TIME_HI_AND_VER CLOCK_AND_SEQ) uuid_canon_to_octets(UUID ${_MY_PARAMS_UUID} RES _uuid_octets) #Split the list of bytes in to the struct fields list(SUBLIST _uuid_octets 0 4 _uuid_timeLow) list(JOIN _uuid_timeLow "" _uuid_timeLow) list(SUBLIST _uuid_octets 4 2 _uuid_timeMid) list(JOIN _uuid_timeMid "" _uuid_timeMid) list(SUBLIST _uuid_octets 6 2 _uuid_timeHiAndVersion) list(JOIN _uuid_timeHiAndVersion "" _uuid_timeHiAndVersion) list(SUBLIST _uuid_octets 8 8 _uuid_clockSeqAndNode) list(JOIN _uuid_clockSeqAndNode "" _uuid_clockSeqAndNode) set(${_MY_PARAMS_TIME_LOW} ${_uuid_timeLow} PARENT_SCOPE) set(${_MY_PARAMS_TIME_MID} ${_uuid_timeMid} PARENT_SCOPE) set(${_MY_PARAMS_TIME_HI_AND_VER} ${_uuid_timeHiAndVersion} PARENT_SCOPE) set(${_MY_PARAMS_CLOCK_AND_SEQ} ${_uuid_clockSeqAndNode} PARENT_SCOPE) endfunction() #[===[.rst: .. cmake:command:: uuid_canon_to_le_words .. code-block:: cmake uuid_canon_to_le_words(UUID RES ) Convert a canonical UUID string to list of 32bit wide little-endian numbers represented as hex strings. INPUTS: ``UUID`` Canonical UUID string. ``RES`` Name of variable to store the result to. #]===] function(uuid_canon_to_le_words) set(options) set(oneValueArgs UUID RES) set(multiValueArgs) cmake_parse_arguments(_MY_PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) check_args(UUID RES) uuid_canon_to_octets(UUID ${_MY_PARAMS_UUID} RES _uuid_octets) # Separate 32 bit chunks list(SUBLIST _uuid_octets 0 4 _word1) list(SUBLIST _uuid_octets 4 4 _word2) list(SUBLIST _uuid_octets 8 4 _word3) list(SUBLIST _uuid_octets 12 4 _word4) # Reverse octet order each word list(REVERSE _word1) list(REVERSE _word2) list(REVERSE _word3) list(REVERSE _word4) # Concatenate octets of each word to a single string list(JOIN _word1 "" _word1) list(JOIN _word2 "" _word2) list(JOIN _word3 "" _word3) list(JOIN _word4 "" _word4) # Return the result set(${_MY_PARAMS_RES} "${_word1}" "${_word2}" "${_word3}" "${_word4}" PARENT_SCOPE) endfunction()