305 lines
12 KiB
C
305 lines
12 KiB
C
/**
|
|
* @file
|
|
* @copyright InSolem SARL reserves all rights even in the event of industrial
|
|
* property rights. We reserve all rights of disposal such as
|
|
* copying and passing on to third parties.
|
|
*
|
|
* @version $Revision: #1 $
|
|
* @change $Change: 17569 $
|
|
* @date $Date: 2022/06/08 $
|
|
* @authors $Author: qbourdon $
|
|
*
|
|
* @brief Utility functions for Insolem's projects.
|
|
*/
|
|
|
|
/******************************************************************************
|
|
* Include-Files
|
|
******************************************************************************/
|
|
#include "nms_utils.h"
|
|
#include "nms_types.h"
|
|
|
|
/******************************************************************************
|
|
* Constants and Macros
|
|
******************************************************************************/
|
|
#define NUM_OF_BITS_UINT64 (64u)
|
|
|
|
/** Table of precomputed Values for computing of crc 32 */
|
|
static const uint32 crc32Tab_au32[256]={
|
|
0x00000000u , 0x77073096u , 0xEE0E612Cu , 0x990951BAu , 0x076DC419u , 0x706AF48Fu , 0xE963A535u , 0x9E6495A3u ,
|
|
0x0EDB8832u , 0x79DCB8A4u , 0xE0D5E91Eu , 0x97D2D988u , 0x09B64C2Bu , 0x7EB17CBDu , 0xE7B82D07u , 0x90BF1D91u ,
|
|
0x1DB71064u , 0x6AB020F2u , 0xF3B97148u , 0x84BE41DEu , 0x1ADAD47Du , 0x6DDDE4EBu , 0xF4D4B551u , 0x83D385C7u ,
|
|
0x136C9856u , 0x646BA8C0u , 0xFD62F97Au , 0x8A65C9ECu , 0x14015C4Fu , 0x63066CD9u , 0xFA0F3D63u , 0x8D080DF5u ,
|
|
0x3B6E20C8u , 0x4C69105Eu , 0xD56041E4u , 0xA2677172u , 0x3C03E4D1u , 0x4B04D447u , 0xD20D85FDu , 0xA50AB56Bu ,
|
|
0x35B5A8FAu , 0x42B2986Cu , 0xDBBBC9D6u , 0xACBCF940u , 0x32D86CE3u , 0x45DF5C75u , 0xDCD60DCFu , 0xABD13D59u ,
|
|
0x26D930ACu , 0x51DE003Au , 0xC8D75180u , 0xBFD06116u , 0x21B4F4B5u , 0x56B3C423u , 0xCFBA9599u , 0xB8BDA50Fu ,
|
|
0x2802B89Eu , 0x5F058808u , 0xC60CD9B2u , 0xB10BE924u , 0x2F6F7C87u , 0x58684C11u , 0xC1611DABu , 0xB6662D3Du ,
|
|
0x76DC4190u , 0x01DB7106u , 0x98D220BCu , 0xEFD5102Au , 0x71B18589u , 0x06B6B51Fu , 0x9FBFE4A5u , 0xE8B8D433u ,
|
|
0x7807C9A2u , 0x0F00F934u , 0x9609A88Eu , 0xE10E9818u , 0x7F6A0DBBu , 0x086D3D2Du , 0x91646C97u , 0xE6635C01u ,
|
|
0x6B6B51F4u , 0x1C6C6162u , 0x856530D8u , 0xF262004Eu , 0x6C0695EDu , 0x1B01A57Bu , 0x8208F4C1u , 0xF50FC457u ,
|
|
0x65B0D9C6u , 0x12B7E950u , 0x8BBEB8EAu , 0xFCB9887Cu , 0x62DD1DDFu , 0x15DA2D49u , 0x8CD37CF3u , 0xFBD44C65u ,
|
|
0x4DB26158u , 0x3AB551CEu , 0xA3BC0074u , 0xD4BB30E2u , 0x4ADFA541u , 0x3DD895D7u , 0xA4D1C46Du , 0xD3D6F4FBu ,
|
|
0x4369E96Au , 0x346ED9FCu , 0xAD678846u , 0xDA60B8D0u , 0x44042D73u , 0x33031DE5u , 0xAA0A4C5Fu , 0xDD0D7CC9u ,
|
|
0x5005713Cu , 0x270241AAu , 0xBE0B1010u , 0xC90C2086u , 0x5768B525u , 0x206F85B3u , 0xB966D409u , 0xCE61E49Fu ,
|
|
0x5EDEF90Eu , 0x29D9C998u , 0xB0D09822u , 0xC7D7A8B4u , 0x59B33D17u , 0x2EB40D81u , 0xB7BD5C3Bu , 0xC0BA6CADu ,
|
|
0xEDB88320u , 0x9ABFB3B6u , 0x03B6E20Cu , 0x74B1D29Au , 0xEAD54739u , 0x9DD277AFu , 0x04DB2615u , 0x73DC1683u ,
|
|
0xE3630B12u , 0x94643B84u , 0x0D6D6A3Eu , 0x7A6A5AA8u , 0xE40ECF0Bu , 0x9309FF9Du , 0x0A00AE27u , 0x7D079EB1u ,
|
|
0xF00F9344u , 0x8708A3D2u , 0x1E01F268u , 0x6906C2FEu , 0xF762575Du , 0x806567CBu , 0x196C3671u , 0x6E6B06E7u ,
|
|
0xFED41B76u , 0x89D32BE0u , 0x10DA7A5Au , 0x67DD4ACCu , 0xF9B9DF6Fu , 0x8EBEEFF9u , 0x17B7BE43u , 0x60B08ED5u ,
|
|
0xD6D6A3E8u , 0xA1D1937Eu , 0x38D8C2C4u , 0x4FDFF252u , 0xD1BB67F1u , 0xA6BC5767u , 0x3FB506DDu , 0x48B2364Bu ,
|
|
0xD80D2BDAu , 0xAF0A1B4Cu , 0x36034AF6u , 0x41047A60u , 0xDF60EFC3u , 0xA867DF55u , 0x316E8EEFu , 0x4669BE79u ,
|
|
0xCB61B38Cu , 0xBC66831Au , 0x256FD2A0u , 0x5268E236u , 0xCC0C7795u , 0xBB0B4703u , 0x220216B9u , 0x5505262Fu ,
|
|
0xC5BA3BBEu , 0xB2BD0B28u , 0x2BB45A92u , 0x5CB36A04u , 0xC2D7FFA7u , 0xB5D0CF31u , 0x2CD99E8Bu , 0x5BDEAE1Du ,
|
|
0x9B64C2B0u , 0xEC63F226u , 0x756AA39Cu , 0x026D930Au , 0x9C0906A9u , 0xEB0E363Fu , 0x72076785u , 0x05005713u ,
|
|
0x95BF4A82u , 0xE2B87A14u , 0x7BB12BAEu , 0x0CB61B38u , 0x92D28E9Bu , 0xE5D5BE0Du , 0x7CDCEFB7u , 0x0BDBDF21u ,
|
|
0x86D3D2D4u , 0xF1D4E242u , 0x68DDB3F8u , 0x1FDA836Eu , 0x81BE16CDu , 0xF6B9265Bu , 0x6FB077E1u , 0x18B74777u ,
|
|
0x88085AE6u , 0xFF0F6A70u , 0x66063BCAu , 0x11010B5Cu , 0x8F659EFFu , 0xF862AE69u , 0x616BFFD3u , 0x166CCF45u ,
|
|
0xA00AE278u , 0xD70DD2EEu , 0x4E048354u , 0x3903B3C2u , 0xA7672661u , 0xD06016F7u , 0x4969474Du , 0x3E6E77DBu ,
|
|
0xAED16A4Au , 0xD9D65ADCu , 0x40DF0B66u , 0x37D83BF0u , 0xA9BCAE53u , 0xDEBB9EC5u , 0x47B2CF7Fu , 0x30B5FFE9u ,
|
|
0xBDBDF21Cu , 0xCABAC28Au , 0x53B39330u , 0x24B4A3A6u , 0xBAD03605u , 0xCDD70693u , 0x54DE5729u , 0x23D967BFu ,
|
|
0xB3667A2Eu , 0xC4614AB8u , 0x5D681B02u , 0x2A6F2B94u , 0xB40BBE37u , 0xC30C8EA1u , 0x5A05DF1Bu , 0x2D02EF8Du
|
|
};
|
|
|
|
static const uint8 modBase64Table_au32[] = {0, 2, 1};
|
|
static const uint8 encodingBase64Table_ac[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
|
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
|
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
|
'w', 'x', 'y', 'z', '0', '1', '2', '3',
|
|
'4', '5', '6', '7', '8', '9', '+', '/'};
|
|
|
|
/******************************************************************************
|
|
* Types declarations
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
* Static Functions Declarations
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
* Global Variables Declarations
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
* Module Global Variables
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
* Functions Definitions
|
|
******************************************************************************/
|
|
void NmsMemSet(void * dest_pv, uint8 val_u8, uint32 len_u32)
|
|
{
|
|
uint8 * mem_addr_pu8 = (uint8*)dest_pv;
|
|
uint32 nbBytes_u32;
|
|
|
|
for(nbBytes_u32 = 0u; nbBytes_u32 < len_u32; nbBytes_u32++)
|
|
{
|
|
*(mem_addr_pu8 + nbBytes_u32) = val_u8;
|
|
}
|
|
}
|
|
|
|
|
|
void NmsMemCpy(void * dest_pv, const void * src_pv, uint32 len_u32)
|
|
{
|
|
uint8 * mem_addr_dest_pu8 = (uint8*)dest_pv;
|
|
const uint8 * mem_addr_src_pu8 = (const uint8*)src_pv;
|
|
uint32 nbBytes_u32;
|
|
|
|
for(nbBytes_u32 = 0ul; nbBytes_u32 < len_u32; nbBytes_u32++)
|
|
{
|
|
*(mem_addr_dest_pu8 + nbBytes_u32) = *(mem_addr_src_pu8 + nbBytes_u32);
|
|
}
|
|
}
|
|
|
|
|
|
bool NmsMemCmp(const void * src1_pv, const void * src2_pv, uint32 len_u32)
|
|
{
|
|
const uint8 * mem_addr_src1_pu8 = (const uint8*)src1_pv;
|
|
const uint8 * mem_addr_src2_pu8 = (const uint8*)src2_pv;
|
|
uint32 nbBytes_u32;
|
|
bool rslt_b = true;
|
|
|
|
for(nbBytes_u32 = 0ul; nbBytes_u32 < len_u32; nbBytes_u32++)
|
|
{
|
|
if(*(mem_addr_src1_pu8 + nbBytes_u32) != *(mem_addr_src2_pu8 + nbBytes_u32))
|
|
{
|
|
rslt_b = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return rslt_b;
|
|
}
|
|
|
|
|
|
void NmsMemRvs(void * dest_pv, const void * src_pv, uint32 len_u32)
|
|
{
|
|
uint8 * mem_addr_dest_pu8 = (uint8*)dest_pv;
|
|
const uint8 * mem_addr_src_pu8 = (const uint8*)src_pv;
|
|
uint32 start_u32 = 0ul;
|
|
uint32 end_u32 = len_u32;
|
|
|
|
/* No reverse on a single byte */
|
|
if(len_u32 > 1ul)
|
|
{
|
|
do
|
|
{
|
|
end_u32--;
|
|
*(mem_addr_dest_pu8 + start_u32) = *(mem_addr_src_pu8 + end_u32);
|
|
start_u32++;
|
|
} while (end_u32 != 0ul);
|
|
}
|
|
else /* len_u32 == 1. We do not expect developer to pass a length of zero... */
|
|
{
|
|
*mem_addr_dest_pu8 = *mem_addr_src_pu8;
|
|
}
|
|
}
|
|
|
|
|
|
bool NmsMemGetBit(uint64 value_u64, uint8 pos_u8)
|
|
{
|
|
bool bit_b = false;
|
|
|
|
if (pos_u8 < NUM_OF_BITS_UINT64)
|
|
{
|
|
bit_b = (bool)((value_u64 >> pos_u8) & 1u);
|
|
}
|
|
|
|
return bit_b;
|
|
}
|
|
|
|
|
|
uint64 NmsMemSetBit(uint64 value_u64, bool bit_b, uint8 pos_u8)
|
|
{
|
|
uint64 newValue_u64 = value_u64;
|
|
|
|
if (pos_u8 < NUM_OF_BITS_UINT64)
|
|
{
|
|
if (bit_b == true)
|
|
{
|
|
/* Set the bit */
|
|
newValue_u64 |= (uint64)(1ull << pos_u8);
|
|
}
|
|
else
|
|
{
|
|
/* Reset the bit */
|
|
uint64 mask_u64 = 1ull;
|
|
mask_u64 = mask_u64 << pos_u8;
|
|
newValue_u64 &= (uint64)(~mask_u64);
|
|
}
|
|
}
|
|
|
|
return newValue_u64;
|
|
}
|
|
|
|
|
|
uint64 NmsBytesToUint(const uint8 bytes_tu8[], uint8 nb_u8)
|
|
{
|
|
uint64 value_u64 = 0u;
|
|
|
|
for(uint8 i_u8 = 0u; i_u8 < nb_u8; i_u8++)
|
|
{
|
|
value_u64 = value_u64 << 8u;
|
|
value_u64 |= (uint64)(bytes_tu8[i_u8]);
|
|
}
|
|
|
|
return value_u64;
|
|
}
|
|
|
|
|
|
void NmsUintToBytes(uint64 value_u64, uint8 bytes_tu8[], uint8 nb_u8)
|
|
{
|
|
for(uint8 i_u8 = 0; i_u8 < nb_u8; i_u8++)
|
|
{
|
|
bytes_tu8[i_u8] = (uint8)((value_u64 >> ((nb_u8 - i_u8 - (uint8)1u) * (uint8)8u)) & 0x00000000000000FFull);
|
|
}
|
|
}
|
|
|
|
|
|
uint32 NmsItoa(sint64 num_i64, char str_tc[], uint8 base_u8, uint32 len_u32)
|
|
{
|
|
uint32 end_u32 = 0ul, start_u32 = 0ul, size_u32 = 0ul;
|
|
uint64 rem_u64 = 0ull;
|
|
bool isNegative_b = false;
|
|
|
|
/* Check if string destination minimum length is configured */
|
|
if(len_u32 > 1ul)
|
|
{
|
|
/* Handle 0 explicitely, otherwise empty string is printed for 0 */
|
|
if(num_i64 == 0ll)
|
|
{
|
|
str_tc[end_u32++] = '0';
|
|
str_tc[end_u32] = '\0';
|
|
size_u32 = 2u;
|
|
}
|
|
else
|
|
{
|
|
/* Reserve space for symbol '\0' to put at the end of conversion */
|
|
len_u32--; /* Value must never be negative. Indicates space left in the destination string. */
|
|
|
|
/* In non-standard itoa(), negative numbers are handled only with
|
|
* base 10. Otherwise numbers are considered unsigned.
|
|
*/
|
|
if( (num_i64 < 0ll) && (base_u8 == 10u) )
|
|
{
|
|
isNegative_b = true;
|
|
num_i64 = -num_i64;
|
|
len_u32--; /* Reserve space for symbol '-' to put at the end of
|
|
conversion (reverse order) */
|
|
}
|
|
|
|
/* Process individual digits */
|
|
while( (num_i64 != 0ll) && (len_u32 >= 1ul) )
|
|
{
|
|
rem_u64 = (uint64)num_i64 % (uint64)base_u8;
|
|
str_tc[end_u32++] = (char)( (rem_u64 > 9ull) ? (rem_u64 - 10ull) + 'A' : rem_u64 + '0' );
|
|
num_i64 = num_i64/(sint64)base_u8;
|
|
len_u32--;
|
|
}
|
|
|
|
/* If number is negative, append '-' */
|
|
if(isNegative_b == true)
|
|
{
|
|
str_tc[end_u32++] = '-';
|
|
}
|
|
|
|
str_tc[end_u32] = '\0'; /* Append string terminator */
|
|
|
|
/* Compute the string */
|
|
if(num_i64 != 0ll)
|
|
{
|
|
size_u32 = 0ul; /* Length overflow, indicate size of 0 */
|
|
}
|
|
else
|
|
{
|
|
/* Reverse the string */
|
|
end_u32--; /* Keep string terminator in last position */
|
|
|
|
while(start_u32<end_u32)
|
|
{
|
|
char buffer_c = str_tc[start_u32];
|
|
str_tc[start_u32] = str_tc[end_u32];
|
|
str_tc[end_u32] = buffer_c;
|
|
start_u32++;
|
|
end_u32--;
|
|
}
|
|
|
|
size_u32 = start_u32 + end_u32; /* maximum table index */
|
|
size_u32++; /* size of the string */
|
|
size_u32++; /* add null-terminated string */
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Keep the string empty. Size still 0. */
|
|
}
|
|
|
|
return size_u32;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Private functions definitions
|
|
******************************************************************************/
|