github.com/guiltylotus/go-ethereum@v1.9.7/crypto/secp256k1/libsecp256k1/src/util.h (about) 1 /********************************************************************** 2 * Copyright (c) 2013, 2014 Pieter Wuille * 3 * Distributed under the MIT software license, see the accompanying * 4 * file COPYING or http://www.opensource.org/licenses/mit-license.php.* 5 **********************************************************************/ 6 7 #ifndef _SECP256K1_UTIL_H_ 8 #define _SECP256K1_UTIL_H_ 9 10 #if defined HAVE_CONFIG_H 11 #include "libsecp256k1-config.h" 12 #endif 13 14 #include <stdlib.h> 15 #include <stdint.h> 16 #include <stdio.h> 17 18 typedef struct { 19 void (*fn)(const char *text, void* data); 20 const void* data; 21 } secp256k1_callback; 22 23 static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { 24 cb->fn(text, (void*)cb->data); 25 } 26 27 #ifdef DETERMINISTIC 28 #define TEST_FAILURE(msg) do { \ 29 fprintf(stderr, "%s\n", msg); \ 30 abort(); \ 31 } while(0); 32 #else 33 #define TEST_FAILURE(msg) do { \ 34 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ 35 abort(); \ 36 } while(0) 37 #endif 38 39 #ifdef HAVE_BUILTIN_EXPECT 40 #define EXPECT(x,c) __builtin_expect((x),(c)) 41 #else 42 #define EXPECT(x,c) (x) 43 #endif 44 45 #ifdef DETERMINISTIC 46 #define CHECK(cond) do { \ 47 if (EXPECT(!(cond), 0)) { \ 48 TEST_FAILURE("test condition failed"); \ 49 } \ 50 } while(0) 51 #else 52 #define CHECK(cond) do { \ 53 if (EXPECT(!(cond), 0)) { \ 54 TEST_FAILURE("test condition failed: " #cond); \ 55 } \ 56 } while(0) 57 #endif 58 59 /* Like assert(), but when VERIFY is defined, and side-effect safe. */ 60 #if defined(COVERAGE) 61 #define VERIFY_CHECK(check) 62 #define VERIFY_SETUP(stmt) 63 #elif defined(VERIFY) 64 #define VERIFY_CHECK CHECK 65 #define VERIFY_SETUP(stmt) do { stmt; } while(0) 66 #else 67 #define VERIFY_CHECK(cond) do { (void)(cond); } while(0) 68 #define VERIFY_SETUP(stmt) 69 #endif 70 71 static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { 72 void *ret = malloc(size); 73 if (ret == NULL) { 74 secp256k1_callback_call(cb, "Out of memory"); 75 } 76 return ret; 77 } 78 79 /* Macro for restrict, when available and not in a VERIFY build. */ 80 #if defined(SECP256K1_BUILD) && defined(VERIFY) 81 # define SECP256K1_RESTRICT 82 #else 83 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) 84 # if SECP256K1_GNUC_PREREQ(3,0) 85 # define SECP256K1_RESTRICT __restrict__ 86 # elif (defined(_MSC_VER) && _MSC_VER >= 1400) 87 # define SECP256K1_RESTRICT __restrict 88 # else 89 # define SECP256K1_RESTRICT 90 # endif 91 # else 92 # define SECP256K1_RESTRICT restrict 93 # endif 94 #endif 95 96 #if defined(_WIN32) 97 # define I64FORMAT "I64d" 98 # define I64uFORMAT "I64u" 99 #else 100 # define I64FORMAT "lld" 101 # define I64uFORMAT "llu" 102 #endif 103 104 #if defined(HAVE___INT128) 105 # if defined(__GNUC__) 106 # define SECP256K1_GNUC_EXT __extension__ 107 # else 108 # define SECP256K1_GNUC_EXT 109 # endif 110 SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; 111 #endif 112 113 #endif