fix #109 - improved arch/endianness detection + tomcrypt_cfg.h facelift
This commit is contained in:
		
							parent
							
								
									44f29d895c
								
							
						
					
					
						commit
						e26078d2f7
					
				| @ -8,15 +8,13 @@ | |||||||
| #define TOMCRYPT_CFG_H | #define TOMCRYPT_CFG_H | ||||||
| 
 | 
 | ||||||
| #if defined(_WIN32) || defined(_MSC_VER) | #if defined(_WIN32) || defined(_MSC_VER) | ||||||
| #define LTC_CALL __cdecl |    #define LTC_CALL __cdecl | ||||||
| #else | #elif !defined(LTC_CALL) | ||||||
| #ifndef LTC_CALL |  | ||||||
|    #define LTC_CALL |    #define LTC_CALL | ||||||
| #endif | #endif | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| #ifndef LTC_EXPORT | #ifndef LTC_EXPORT | ||||||
| #define LTC_EXPORT |    #define LTC_EXPORT | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* certain platforms use macros for these, making the prototypes broken */ | /* certain platforms use macros for these, making the prototypes broken */ | ||||||
| @ -63,35 +61,122 @@ LTC_EXPORT int   LTC_CALL XSTRCMP(const char *s1, const char *s2); | |||||||
|  * The x86 platforms allow this but some others [ARM for instance] do not.  On those platforms you **MUST** |  * The x86 platforms allow this but some others [ARM for instance] do not.  On those platforms you **MUST** | ||||||
|  * use the portable [slower] macros. |  * use the portable [slower] macros. | ||||||
|  */ |  */ | ||||||
| 
 | /* detect x86/i386 32bit */ | ||||||
| /* detect x86-32 machines somewhat */ | #if defined(__i386__) || defined(__i386) || defined(_M_IX86) | ||||||
| #if !defined(__STRICT_ANSI__) && !defined(__x86_64__) && !defined(_WIN64) && ((defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__)))) |  | ||||||
|    #define ENDIAN_LITTLE |    #define ENDIAN_LITTLE | ||||||
|    #define ENDIAN_32BITWORD |    #define ENDIAN_32BITWORD | ||||||
|    #define LTC_FAST |    #define LTC_FAST | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* detects MIPS R5900 processors (PS2) */ | /* detect amd64/x64 */ | ||||||
| #if (defined(__R5900) || defined(R5900) || defined(__R5900__)) && (defined(_mips) || defined(__mips__) || defined(mips)) | #if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) | ||||||
|    #define ENDIAN_LITTLE |  | ||||||
|    #define ENDIAN_64BITWORD |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /* detect amd64 */ |  | ||||||
| #if !defined(__STRICT_ANSI__) && defined(__x86_64__) |  | ||||||
|    #define ENDIAN_LITTLE |    #define ENDIAN_LITTLE | ||||||
|    #define ENDIAN_64BITWORD |    #define ENDIAN_64BITWORD | ||||||
|    #define LTC_FAST |    #define LTC_FAST | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* detect PPC32 */ | /* detect PPC32 */ | ||||||
| #if !defined(__STRICT_ANSI__) && defined(LTC_PPC32) | #if defined(LTC_PPC32) | ||||||
|    #define ENDIAN_BIG |    #define ENDIAN_BIG | ||||||
|    #define ENDIAN_32BITWORD |    #define ENDIAN_32BITWORD | ||||||
|    #define LTC_FAST |    #define LTC_FAST | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* fix for MSVC ...evil! */ | /* detects MIPS R5900 processors (PS2) */ | ||||||
|  | #if (defined(__R5900) || defined(R5900) || defined(__R5900__)) && (defined(_mips) || defined(__mips__) || defined(mips)) | ||||||
|  |    #define ENDIAN_64BITWORD | ||||||
|  |    #if defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) | ||||||
|  |      #define ENDIAN_BIG | ||||||
|  |    #endif | ||||||
|  |      #define ENDIAN_LITTLE | ||||||
|  |    #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect AIX */ | ||||||
|  | #if defined(_AIX) && defined(_BIG_ENDIAN) | ||||||
|  |   #define ENDIAN_BIG | ||||||
|  |   #if defined(__LP64__) || defined(_ARCH_PPC64) | ||||||
|  |     #define ENDIAN_64BITWORD | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_32BITWORD | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect HP-UX */ | ||||||
|  | #if defined(__hpux) || defined(__hpux__) | ||||||
|  |   #define ENDIAN_BIG | ||||||
|  |   #if defined(__ia64) || defined(__ia64__) || defined(__LP64__) | ||||||
|  |     #define ENDIAN_64BITWORD | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_32BITWORD | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect Apple OS X */ | ||||||
|  | #if defined(__APPLE__) && defined(__MACH__) | ||||||
|  |   #if defined(__LITTLE_ENDIAN__) || defined(__x86_64__) | ||||||
|  |     #define ENDIAN_LITTLE | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_BIG | ||||||
|  |   #endif | ||||||
|  |   #if defined(__LP64__) || defined(__x86_64__) | ||||||
|  |     #define ENDIAN_64BITWORD | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_32BITWORD | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect SPARC and SPARC64 */ | ||||||
|  | #if defined(__sparc__) || defined(__sparc) | ||||||
|  |   #define ENDIAN_BIG | ||||||
|  |   #if defined(__arch64__) || defined(__sparcv9) || defined(__sparc_v9__) | ||||||
|  |     #define ENDIAN_64BITWORD | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_32BITWORD | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect IBM S390(x) */ | ||||||
|  | #if defined(__s390x__) || defined(__s390__) | ||||||
|  |   #define ENDIAN_BIG | ||||||
|  |   #if defined(__s390x__) | ||||||
|  |     #define ENDIAN_64BITWORD | ||||||
|  |   #else | ||||||
|  |     #define ENDIAN_32BITWORD | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* detect PPC64 */ | ||||||
|  | #if defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) | ||||||
|  |    #define ENDIAN_64BITWORD | ||||||
|  |    #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ | ||||||
|  |       #define ENDIAN_BIG | ||||||
|  |    #elif  __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | ||||||
|  |       #define ENDIAN_LITTLE | ||||||
|  |    #endif | ||||||
|  |    #define LTC_FAST | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* endianness fallback */ | ||||||
|  | #if !defined(ENDIAN_BIG) && !defined(ENDIAN_LITTLE) | ||||||
|  |   #if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \ | ||||||
|  |       defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ || \ | ||||||
|  |       defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN) || \ | ||||||
|  |       defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \ | ||||||
|  |       defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) | ||||||
|  |     #define ENDIAN_BIG | ||||||
|  |   #elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \ | ||||||
|  |       defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || \ | ||||||
|  |       defined(__LITTLE_ENDIAN__) || defined(_LITTLE_ENDIAN) || \ | ||||||
|  |       defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \ | ||||||
|  |       defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) | ||||||
|  |     #define ENDIAN_LITTLE | ||||||
|  |   #else | ||||||
|  |     #error Cannot detect endianness | ||||||
|  |   #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* ulong64: 64-bit data type */ | ||||||
| #ifdef _MSC_VER | #ifdef _MSC_VER | ||||||
|    #define CONST64(n) n ## ui64 |    #define CONST64(n) n ## ui64 | ||||||
|    typedef unsigned __int64 ulong64; |    typedef unsigned __int64 ulong64; | ||||||
| @ -100,40 +185,36 @@ LTC_EXPORT int   LTC_CALL XSTRCMP(const char *s1, const char *s2); | |||||||
|    typedef unsigned long long ulong64; |    typedef unsigned long long ulong64; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* this is the "32-bit at least" data type
 | /* ulong32: "32-bit at least" data type */ | ||||||
|  * Re-define it to suit your platform but it must be at least 32-bits | #if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) || \ | ||||||
|  */ |     defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \ | ||||||
| #if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__)) |     defined(__s390x__) || defined(__arch64__) || defined(__aarch64__) || \ | ||||||
|  |     defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || \ | ||||||
|  |     defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \ | ||||||
|  |     defined(__LP64__) || defined(_LP64) || defined(__64BIT__) | ||||||
|    typedef unsigned ulong32; |    typedef unsigned ulong32; | ||||||
|  |    #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD) | ||||||
|  |      #define ENDIAN_64BITWORD | ||||||
|  |    #endif | ||||||
| #else | #else | ||||||
|    typedef unsigned long ulong32; |    typedef unsigned long ulong32; | ||||||
|  |    #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD) | ||||||
|  |      #define ENDIAN_32BITWORD | ||||||
|  |    #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef LTC_NO_FAST | /* No LTC_FAST if: explicitly disabled OR non-gcc/non-clang compiler OR old gcc OR using -ansi -std=c99 */ | ||||||
|  | #if defined(LTC_NO_FAST) || (__GNUC__ < 4) || defined(__STRICT_ANSI__) | ||||||
|    #undef LTC_FAST |    #undef LTC_FAST | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef LTC_FAST | #ifdef LTC_FAST | ||||||
| #if __GNUC__ < 4 /* if the compiler does not support gnu extensions, i.e. its neither clang nor gcc nor icc */ |    #define LTC_FAST_TYPE_PTR_CAST(x) ((LTC_FAST_TYPE*)(void*)(x)) | ||||||
| #error the LTC_FAST hack is only available on compilers that support __attribute__((may_alias)) - disable it for your compiler, and dont worry, it won`t buy you much anyway |    #ifdef ENDIAN_64BITWORD | ||||||
| #else |    typedef ulong64 __attribute__((__may_alias__)) LTC_FAST_TYPE; | ||||||
| #ifdef ENDIAN_64BITWORD |    #else | ||||||
| typedef ulong64 __attribute__((__may_alias__)) LTC_FAST_TYPE; |    typedef ulong32 __attribute__((__may_alias__)) LTC_FAST_TYPE; | ||||||
| #else |    #endif | ||||||
| typedef ulong32 __attribute__((__may_alias__)) LTC_FAST_TYPE; |  | ||||||
| #endif |  | ||||||
| #define LTC_FAST_TYPE_PTR_CAST(x) ((LTC_FAST_TYPE*)(void*)(x)) |  | ||||||
| #endif |  | ||||||
| #endif /* LTC_FAST */ |  | ||||||
| 
 |  | ||||||
| /* detect sparc and sparc64 */ |  | ||||||
| #if defined(__sparc__) |  | ||||||
|   #define ENDIAN_BIG |  | ||||||
|   #if defined(__arch64__) |  | ||||||
|     #define ENDIAN_64BITWORD |  | ||||||
|   #else |  | ||||||
|     #define ENDIAN_32BITWORD |  | ||||||
|   #endif |  | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef ENDIAN_64BITWORD | #ifdef ENDIAN_64BITWORD | ||||||
| @ -144,8 +225,7 @@ typedef ulong32 ltc_mp_digit; | |||||||
| 
 | 
 | ||||||
| /* No asm is a quick way to disable anything "not portable" */ | /* No asm is a quick way to disable anything "not portable" */ | ||||||
| #ifdef LTC_NO_ASM | #ifdef LTC_NO_ASM | ||||||
|    #undef ENDIAN_LITTLE |    #define ENDIAN_NEUTRAL | ||||||
|    #undef ENDIAN_BIG |  | ||||||
|    #undef ENDIAN_32BITWORD |    #undef ENDIAN_32BITWORD | ||||||
|    #undef ENDIAN_64BITWORD |    #undef ENDIAN_64BITWORD | ||||||
|    #undef LTC_FAST |    #undef LTC_FAST | ||||||
| @ -154,13 +234,7 @@ typedef ulong32 ltc_mp_digit; | |||||||
|    #define LTC_NO_BSWAP |    #define LTC_NO_BSWAP | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* #define ENDIAN_LITTLE */ | #if !defined(ENDIAN_NEUTRAL) && (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD)) | ||||||
| /* #define ENDIAN_BIG */ |  | ||||||
| 
 |  | ||||||
| /* #define ENDIAN_32BITWORD */ |  | ||||||
| /* #define ENDIAN_64BITWORD */ |  | ||||||
| 
 |  | ||||||
| #if (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD)) |  | ||||||
|     #error You must specify a word size as well as endianess in tomcrypt_cfg.h |     #error You must specify a word size as well as endianess in tomcrypt_cfg.h | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| @ -169,7 +243,7 @@ typedef ulong32 ltc_mp_digit; | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if (defined(ENDIAN_32BITWORD) && defined(ENDIAN_64BITWORD)) | #if (defined(ENDIAN_32BITWORD) && defined(ENDIAN_64BITWORD)) | ||||||
|     #error Can not be 32 and 64 bit words... |     #error Cannot be 32 and 64 bit words... | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* gcc 4.3 and up has a bswap builtin; detect it by gcc version.
 | /* gcc 4.3 and up has a bswap builtin; detect it by gcc version.
 | ||||||
| @ -188,8 +262,6 @@ typedef ulong32 ltc_mp_digit; | |||||||
|    #define LTC_HAVE_BSWAP_BUILTIN |    #define LTC_HAVE_BSWAP_BUILTIN | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| /* $Source$ */ | /* $Source$ */ | ||||||
| /* $Revision$ */ | /* $Revision$ */ | ||||||
|  | |||||||
| @ -46,9 +46,8 @@ do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ | |||||||
|          (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ |          (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ | ||||||
|          (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0) |          (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0) | ||||||
| 
 | 
 | ||||||
| #endif /* ENDIAN_NEUTRAL */ |  | ||||||
| 
 | 
 | ||||||
| #ifdef ENDIAN_LITTLE | #elif defined(ENDIAN_LITTLE) | ||||||
| 
 | 
 | ||||||
| #ifdef LTC_HAVE_BSWAP_BUILTIN | #ifdef LTC_HAVE_BSWAP_BUILTIN | ||||||
| 
 | 
 | ||||||
| @ -167,9 +166,8 @@ do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ | |||||||
| 
 | 
 | ||||||
| #endif /* ENDIAN_64BITWORD */ | #endif /* ENDIAN_64BITWORD */ | ||||||
| 
 | 
 | ||||||
| #endif /* ENDIAN_LITTLE */ | #elif defined(ENDIAN_BIG) | ||||||
| 
 | 
 | ||||||
| #ifdef ENDIAN_BIG |  | ||||||
| #define STORE32L(x, y)                                                                     \ | #define STORE32L(x, y)                                                                     \ | ||||||
|   do { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \ |   do { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \ | ||||||
|        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) | ||||||
|  | |||||||
| @ -20,19 +20,20 @@ | |||||||
| 
 | 
 | ||||||
| static const ulong32 _CRC32_NEGL = 0xffffffffUL; | static const ulong32 _CRC32_NEGL = 0xffffffffUL; | ||||||
| 
 | 
 | ||||||
| #if defined(ENDIAN_LITTLE) || defined(ENDIAN_NEUTRAL) | #if defined(ENDIAN_LITTLE) | ||||||
| #define CRC32_INDEX(c) (c & 0xff) | #define CRC32_INDEX(c) (c & 0xff) | ||||||
| #define CRC32_SHIFTED(c) (c >> 8) | #define CRC32_SHIFTED(c) (c >> 8) | ||||||
| #else | #elif defined(ENDIAN_BIG) | ||||||
| #define CRC32_INDEX(c) (c >> 24) | #define CRC32_INDEX(c) (c >> 24) | ||||||
| #define CRC32_SHIFTED(c) (c << 8) | #define CRC32_SHIFTED(c) (c << 8) | ||||||
|  | #else | ||||||
|  | #error The existing CRC32 implementation only works properly when the endianness of the target platform is known. | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* Table of CRC-32's of all single byte values (made by makecrc.c) */ | /* Table of CRC-32's of all single byte values (made by makecrc.c) */ | ||||||
| static const ulong32 crc32_m_tab[] = | static const ulong32 crc32_m_tab[] = | ||||||
| { | { | ||||||
| #if defined(ENDIAN_LITTLE) || defined(ENDIAN_NEUTRAL) | #if defined(ENDIAN_LITTLE) | ||||||
|       0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, |       0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, | ||||||
|       0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, |       0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, | ||||||
|       0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, |       0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, | ||||||
| @ -162,10 +163,9 @@ void crc32_update(crc32_state *ctx, const unsigned char *input, unsigned long le | |||||||
| 
 | 
 | ||||||
| void crc32_finish(crc32_state *ctx, void *hash, unsigned long size) | void crc32_finish(crc32_state *ctx, void *hash, unsigned long size) | ||||||
| { | { | ||||||
|    unsigned char* h; |  | ||||||
|    unsigned long i; |    unsigned long i; | ||||||
|  |    unsigned char* h; | ||||||
|    ulong32 crc; |    ulong32 crc; | ||||||
| 
 |  | ||||||
|    LTC_ARGCHKVD(ctx != NULL); |    LTC_ARGCHKVD(ctx != NULL); | ||||||
|    LTC_ARGCHKVD(hash != NULL); |    LTC_ARGCHKVD(hash != NULL); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,8 +25,8 @@ const char *crypt_build_settings = | |||||||
| #endif | #endif | ||||||
|    "\n\nEndianness: " |    "\n\nEndianness: " | ||||||
| #if defined(ENDIAN_NEUTRAL) | #if defined(ENDIAN_NEUTRAL) | ||||||
|    "neutral\n" |    "neutral/" | ||||||
| #else | #endif | ||||||
| #if defined(ENDIAN_LITTLE) | #if defined(ENDIAN_LITTLE) | ||||||
|    "little" |    "little" | ||||||
| #elif defined(ENDIAN_BIG) | #elif defined(ENDIAN_BIG) | ||||||
| @ -34,10 +34,11 @@ const char *crypt_build_settings = | |||||||
| #endif | #endif | ||||||
|    #if defined(ENDIAN_32BITWORD) |    #if defined(ENDIAN_32BITWORD) | ||||||
|    " (32-bit words)\n" |    " (32-bit words)\n" | ||||||
|    #else |    #elif defined(ENDIAN_64BITWORD) | ||||||
|    " (64-bit words)\n" |    " (64-bit words)\n" | ||||||
|  |    #else | ||||||
|  |    " (no wordsize defined)\n" | ||||||
|    #endif |    #endif | ||||||
| #endif |  | ||||||
|    "Clean stack: " |    "Clean stack: " | ||||||
| #if defined(LTC_CLEAN_STACK) | #if defined(LTC_CLEAN_STACK) | ||||||
|    "enabled\n" |    "enabled\n" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user