📄 lbn.h
字号:
/* * lbn.h - Low-level bignum header. * Defines various word sizes and useful macros. * * Copyright (c) 1995 Colin Plumb. All rights reserved. * For licensing and other legal details, see the file legal.c. */#ifndef LBN_H#define LBN_H#if HAVE_CONFIG_H#include "config.h"#endif#if !NO_LIMITS_H#include <limits.h>#if UCHAR_MAX != 0xff || CHAR_BIT != 8#error The bignum library requires 8-bit unsigned characters.#endif#endif#ifdef BNINCLUDE /* If this is defined as, say, foo.h */#define STR(x) #x /* STR(BNINCLUDE) -> "BNINCLUDE" */#define XSTR(x) STR(x) /* XSTR(BNINCLUDE) -> STR(foo.h) -> "foo.h" */#include XSTR(BNINCLUDE) /* #include "foo.h" */#undef XSTR#undef STR#endif/* Figure out the endianness *//* Error if more than one is defined */#if BN_BIG_ENDIAN && BN_LITTLE_ENDIAN#error Only one of BN_BIG_ENDIAN or BN_LITTLE_ENDIAN may be defined#endif/* * If no preference is stated, little-endian C code is slightly more * efficient, so prefer that. (The endianness here does NOT have to * match the machine's native byte sex; the library's C code will work * either way. The flexibility is allowed for assembly routines * that do care. */#if !defined(BN_BIG_ENDIAN) && !defined(BN_LITTLE_ENDIAN)#define BN_LITTLE_ENDIAN 1#endif /* !BN_BIG_ENDIAN && !BN_LITTLE_ENDIAN *//* Macros to choose between big and little endian */#if BN_BIG_ENDIAN#define BIG(b) b#define LITTLE(l) /*nothing*/#define BIGLITTLE(b,l) b#elif BN_LITTLE_ENDIAN#define BIG(b) /*nothing*/#define LITTLE(l) l#define BIGLITTLE(b,l) l#else#error One of BN_BIG_ENDIAN or BN_LITTLE_ENDIAN must be defined as 1#endif/* * Find a 16-bit unsigned type. * Unsigned short is preferred over unsigned int to make the type chosen * by this file more stable on platforms (such as many 68000 compilers) * which support both 16- and 32-bit ints. */#ifndef BNWORD16#ifndef USHRT_MAX /* No <limits.h> available - guess */typedef unsigned short bnword16;#define BNWORD16 bnword16#elif USHRT_MAX == 0xfffftypedef unsigned short bnword16;#define BNWORD16 bnword16#elif UINT_MAX == 0xfffftypedef unsigned bnword16;#define BNWORD16 bnword16#endif#endif /* BNWORD16 *//* * Find a 32-bit unsigned type. * Unsigned long is preferred over unsigned int to make the type chosen * by this file more stable on platforms (such as many 68000 compilers) * which support both 16- and 32-bit ints. */#ifndef BNWORD32#ifndef ULONG_MAX /* No <limits.h> available - guess */typedef unsigned long bnword32;#define BNWORD32 bnword32#elif ULONG_MAX == 0xffffffffutypedef unsigned long bnword32;#define BNWORD32 bnword32#elif UINT_MAX == 0xffffffffutypedef unsigned bnword32;#define BNWORD32 bnword32#elif USHRT_MAX == 0xffffffffutypedef unsigned short bnword32;#define BNWORD32 bnword32#endif#endif /* BNWORD16 *//* * Find a 64-bit unsigned type. * The conditions here are more complicated to avoid using numbers that * will choke lesser preprocessors (like 0xffffffffffffffff) unless * we're reasonably certain that they'll be acceptable. */#if !defined(BNWORD64) && ULONG_MAX > 0xffffffffu#if ULONG_MAX == 0xffffffffffffffffutypedef unsigned long bnword64;#define BNWORD64 bnword64#endif#endif/* * I would test the value of unsigned long long, but some *preprocessors* * don't constants that long even if the compiler can accept them, so it * doesn't work reliably. So cross our fingers and hope that it's a 64-bit * type. * * GCC uses ULONG_LONG_MAX. Solaris uses ULLONG_MAX. IRIX uses ULONGLONG_MAX. * Are there any other names for this? */#if !defined(BNWORD64) && \ (defined(ULONG_LONG_MAX) || defined (ULLONG_MAX) || defined(ULONGLONG_MAX))typedef unsigned long long bnword64;#define BNWORD64 bnword64#endif/* We don't even try to find a 128-bit type at the moment */#endif /* !LBN_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -