Skip to content

file macro.h

Defines

Name
c_container_of(ptr, type, member)
SECOND(a, b, ...)
IS_PROBE(...)
PROBE()
CAT(a, b)
NOT(x)
NOT
BOOL(x)
IF(condition)
_IF(condition)
_IF_NOT_EMPTY(...)
IF(...)
ASSERT(X)
Assert(X)
MIN(x, y)
MAX(x, y)
UNUSED(expr)
DLLCALL
DLLEXPORT
BYTE_FORMAT
BYTE_SEPARATOR
BYTES_2_FORMAT_SEPARATOR(SEPARATOR)
BYTES_4_FORMAT_SEPARATOR(SEPARATOR)
BYTES_8_FORMAT_SEPARATOR(SEPARATOR)
BYTES_16_FORMAT_SEPARATOR(SEPARATOR)
BYTES_32_FORMAT_SEPARATOR(SEPARATOR)
BYTES_2_FORMAT
BYTES_4_FORMAT
BYTES_8_FORMAT
BYTES_16_FORMAT
BYTES_32_FORMAT
BYTES_2(bytes)
BYTES_4(bytes)
BYTES_8(bytes)
BYTES_16(bytes)
BYTES_32(bytes)
IP32_TO_BYTES_FORMAT
BIT32_TO_BYTES(bits)
IP32_TO_BYTES(ip)
AES_BLOCK_TO_BYTES_FORMAT
AES_BLOCK_TO_BYTES(block)
DLLCALL
DLLEXPORT
UNUSED(expr)

Macros Documentation

define c_container_of

cpp
#define c_container_of(
    ptr,
    type,
    member
)
        ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

define SECOND

cpp
#define SECOND(
    a,
    b,
    ...
)
b

define IS_PROBE

cpp
#define IS_PROBE(
    ...
)
SECOND(__VA_ARGS__,  )

define PROBE

cpp
#define PROBE(
    
)
~, NOT_EMPTY

define CAT

cpp
#define CAT(
    a,
    b
)
a ## b

define NOT

cpp
#define NOT(
    x
)
IS_PROBE(CAT(_NOT_, x))

define NOT

cpp
#define _NOT_ PROBE()

define BOOL

cpp
#define BOOL(
    x
)
NOT(NOT(x))

define IF

cpp
#define IF(
    condition
)
_IF(BOOL(condition))

define _IF

cpp
#define _IF(
    condition
)
CAT(_IF_, condition)

define _IF_NOT_EMPTY

cpp
#define _IF_NOT_EMPTY(
    ...
)

define IF

cpp
#define _IF_(
    ...
)
__VA_ARGS__

define ASSERT

cpp
#define ASSERT(
    X
)

define Assert

cpp
#define Assert(
    X
)

define MIN

cpp
#define MIN(
    x,
    y
)
((x) < (y) ? (x) : (y))

define MAX

cpp
#define MAX(
    x,
    y
)
((x) > (y) ? (x) : (y))

define UNUSED

cpp
#define UNUSED(
    expr
)
do { (void)(expr); } while (0)

define DLLCALL

cpp
#define DLLCALL

define DLLEXPORT

cpp
#define DLLEXPORT

define BYTE_FORMAT

cpp
#define BYTE_FORMAT "%.2hX"

define BYTE_SEPARATOR

cpp
#define BYTE_SEPARATOR " "

define BYTES_2_FORMAT_SEPARATOR

cpp
#define BYTES_2_FORMAT_SEPARATOR(
    SEPARATOR
)
BYTE_FORMAT SEPARATOR BYTE_FORMAT

define BYTES_4_FORMAT_SEPARATOR

cpp
#define BYTES_4_FORMAT_SEPARATOR(
    SEPARATOR
)
BYTES_2_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_2_FORMAT_SEPARATOR(SEPARATOR)

define BYTES_8_FORMAT_SEPARATOR

cpp
#define BYTES_8_FORMAT_SEPARATOR(
    SEPARATOR
)
BYTES_4_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_4_FORMAT_SEPARATOR(SEPARATOR)

define BYTES_16_FORMAT_SEPARATOR

cpp
#define BYTES_16_FORMAT_SEPARATOR(
    SEPARATOR
)
BYTES_8_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_8_FORMAT_SEPARATOR(SEPARATOR)

define BYTES_32_FORMAT_SEPARATOR

cpp
#define BYTES_32_FORMAT_SEPARATOR(
    SEPARATOR
)
BYTES_16_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_16_FORMAT_SEPARATOR(SEPARATOR)

define BYTES_2_FORMAT

cpp
#define BYTES_2_FORMAT BYTES_2_FORMAT_SEPARATOR(BYTE_SEPARATOR)

define BYTES_4_FORMAT

cpp
#define BYTES_4_FORMAT BYTES_4_FORMAT_SEPARATOR(BYTE_SEPARATOR)

define BYTES_8_FORMAT

cpp
#define BYTES_8_FORMAT BYTES_8_FORMAT_SEPARATOR(BYTE_SEPARATOR)

define BYTES_16_FORMAT

cpp
#define BYTES_16_FORMAT BYTES_16_FORMAT_SEPARATOR(BYTE_SEPARATOR)

define BYTES_32_FORMAT

cpp
#define BYTES_32_FORMAT BYTES_32_FORMAT_SEPARATOR(BYTE_SEPARATOR)

define BYTES_2

cpp
#define BYTES_2(
    bytes
)
(bytes)[0], (bytes)[1]

define BYTES_4

cpp
#define BYTES_4(
    bytes
)
BYTES_2(bytes), BYTES_2(bytes + 2)

define BYTES_8

cpp
#define BYTES_8(
    bytes
)
BYTES_4(bytes), BYTES_4(bytes + 4)

define BYTES_16

cpp
#define BYTES_16(
    bytes
)
BYTES_8(bytes), BYTES_8(bytes + 8)

define BYTES_32

cpp
#define BYTES_32(
    bytes
)
BYTES_16(bytes), BYTES_16(bytes + 16)

define IP32_TO_BYTES_FORMAT

cpp
#define IP32_TO_BYTES_FORMAT BYTES_4_FORMAT_SEPARATOR(".")

define BIT32_TO_BYTES

cpp
#define BIT32_TO_BYTES(
    bits
)
BYTES_4((uint8_t*) &(bits))

define IP32_TO_BYTES

cpp
#define IP32_TO_BYTES(
    ip
)
BIT32_TO_BYTES(ip)

define AES_BLOCK_TO_BYTES_FORMAT

cpp
#define AES_BLOCK_TO_BYTES_FORMAT BYTES_16_FORMAT

define AES_BLOCK_TO_BYTES

cpp
#define AES_BLOCK_TO_BYTES(
    block
)
BIT32_TO_BYTES((block)[0]), BIT32_TO_BYTES((block)[1]), BIT32_TO_BYTES((block)[2]), BIT32_TO_BYTES((block)[3])

define DLLCALL

cpp
#define DLLCALL

define DLLEXPORT

cpp
#define DLLEXPORT

define UNUSED

cpp
#define UNUSED(
    expr
)
do { (void)(expr); } while (0)

Source code

cpp
/*******************************************************************************
 * @file       macro.h
 * @brief
 * @copyright  Copyright (c) 2018-2023. ImagineOn GmbH. www.imagineon.de
 *             All rights reserved.
 ******************************************************************************/

#ifndef _COLDWAVEOS_MACRO_H
#define _COLDWAVEOS_MACRO_H

#define c_container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

#define  SECOND(a, b, ...) b

#define  IS_PROBE(...) SECOND(__VA_ARGS__,  )
#define  PROBE() ~, NOT_EMPTY

#define  CAT(a,b) a ## b

#define  NOT(x) IS_PROBE(CAT(_NOT_, x))
#define _NOT_ PROBE()

#define  BOOL(x) NOT(NOT(x))

#define  IF(condition) _IF(BOOL(condition))
#define _IF(condition) CAT(_IF_, condition)

#define _IF_NOT_EMPTY(...)
#define _IF_(...)   __VA_ARGS__

#define ASSERT(X)
#define Assert(X)

#ifndef MIN
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#endif

#ifndef MAX
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#endif

#ifndef UNUSED
#define UNUSED(expr) do { (void)(expr); } while (0)
#endif

#define DLLCALL
#define DLLEXPORT

#define BYTE_FORMAT "%.2hX"
#define BYTE_SEPARATOR " "

#define BYTES_2_FORMAT_SEPARATOR(SEPARATOR) BYTE_FORMAT SEPARATOR BYTE_FORMAT
#define BYTES_4_FORMAT_SEPARATOR(SEPARATOR) BYTES_2_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_2_FORMAT_SEPARATOR(SEPARATOR)
#define BYTES_8_FORMAT_SEPARATOR(SEPARATOR) BYTES_4_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_4_FORMAT_SEPARATOR(SEPARATOR)
#define BYTES_16_FORMAT_SEPARATOR(SEPARATOR) BYTES_8_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_8_FORMAT_SEPARATOR(SEPARATOR)
#define BYTES_32_FORMAT_SEPARATOR(SEPARATOR) BYTES_16_FORMAT_SEPARATOR(SEPARATOR) SEPARATOR BYTES_16_FORMAT_SEPARATOR(SEPARATOR)

#define BYTES_2_FORMAT BYTES_2_FORMAT_SEPARATOR(BYTE_SEPARATOR)
#define BYTES_4_FORMAT BYTES_4_FORMAT_SEPARATOR(BYTE_SEPARATOR)
#define BYTES_8_FORMAT BYTES_8_FORMAT_SEPARATOR(BYTE_SEPARATOR)
#define BYTES_16_FORMAT BYTES_16_FORMAT_SEPARATOR(BYTE_SEPARATOR)
#define BYTES_32_FORMAT BYTES_32_FORMAT_SEPARATOR(BYTE_SEPARATOR)

#define BYTES_2(bytes) (bytes)[0], (bytes)[1]
#define BYTES_4(bytes) BYTES_2(bytes), BYTES_2(bytes + 2)
#define BYTES_8(bytes) BYTES_4(bytes), BYTES_4(bytes + 4)
#define BYTES_16(bytes) BYTES_8(bytes), BYTES_8(bytes + 8)
#define BYTES_32(bytes) BYTES_16(bytes), BYTES_16(bytes + 16)

#define IP32_TO_BYTES_FORMAT BYTES_4_FORMAT_SEPARATOR(".")

#define BIT32_TO_BYTES(bits) BYTES_4((uint8_t*) &(bits))
#define IP32_TO_BYTES(ip) BIT32_TO_BYTES(ip)


#define AES_BLOCK_TO_BYTES_FORMAT BYTES_16_FORMAT
#define AES_BLOCK_TO_BYTES(block) BIT32_TO_BYTES((block)[0]), BIT32_TO_BYTES((block)[1]), BIT32_TO_BYTES((block)[2]), BIT32_TO_BYTES((block)[3])



#endif //_COLDWAVEOSMACRO_H