Support architectures where long is smaller than pointers
I am currently trying to compile fretype for CHERI-extended ISAs (CHERI-RISC-V and Arm's Morello), but I am getting compiler warnings from the FT_UINT_TO_POINTER() macro. When compiling with the CHERI Clang compiler, not using uinptr_t for casts between integers an pointers will result in the following -Werror build failures:
In file included from ../../freetype2/src/truetype/truetype.c:22:
../../freetype2/src/truetype/ttgload.c:1925:22: error: cast from provenance-free integer type to pointer type will give pointer that can not be dereferenced [-Werror,-Wcheri-capability-misuse]
node->data = FT_UINT_TO_POINTER( glyph_index );
^
../../freetype2/include/freetype/internal/compiler-macros.h:79:34: note: expanded from macro 'FT_UINT_TO_POINTER'
#define FT_UINT_TO_POINTER( x ) (void *)(unsigned long)(x)
The ISO C standard compliant fix for this would be to use uintptr_t from
<stdint.h>, but I am not sure if this is supported by the minimum compiler
version. Therefore, use the compiler-defined __UINTPTR_TYPE__
macro
(supported in GCC 4.6+ and Clang since about 3.0) before checking for
_WIN64
and falling back to unsigned long.