modify bigint.h interface to be more like slowlibs

This commit is contained in:
2025-09-05 18:13:49 +02:00
parent b163d18761
commit 777f57a20d

173
bigint.h
View File

@@ -1,28 +1,17 @@
/* SPDX-License-Identifier: 0BSD */
/* Copyright (c) 2023 John Regan <john@jrjrtech.com> */
/* Full license details available at end of file. */
#ifndef BIGINTH
#define BIGINTH
/* Original source: https://github.com/jprjr/bigint.git
* Commit: 26f0d7b27
* With modifications
*
* See git history of this repo
*/
#ifndef BIGINT_H
#define BIGINT_H
#if !defined(BIGINT_API)
#ifdef _WIN32
#define BIGINT_DLL_IMPORT __declspec(dllimport)
#define BIGINT_DLL_EXPORT __declspec(dllexport)
#else
#if defined(__GNUC__) && __GNUC__ >= 4
#define BIGINT_DLL_IMPORT __attribute__((visibility("default")))
#define BIGINT_DLL_EXPORT __attribute__((visibility("default")))
#else
#define BIGINT_DLL_IMPORT
#define BIGINT_DLL_EXPORT
#endif
#endif
#ifdef BIGINT_IMPLEMENTATION
#define BIGINT_API BIGINT_DLL_EXPORT
#else
#define BIGINT_API BIGINT_DLL_IMPORT
#endif
#ifndef BIGINT_FUNC
#define BIGINT_FUNC /**/
#endif
#ifdef __cplusplus
@@ -70,7 +59,7 @@ extern "C" {
#elif BIGINT_WORD_WIDTH == 8
#define BIGINT_WORD_TYPE uint64_t
#else
#error unknown_type
error unknown_type;
#endif
#endif
@@ -112,80 +101,80 @@ typedef struct bigint {
#endif
extern const bigint* BIGINT_ZERO;
BIGINT_API
BIGINT_FUNC
void bigint_init(bigint* b);
BIGINT_API
BIGINT_FUNC
void bigint_free(bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_copy(bigint* b, const bigint* a);
BIGINT_API
BIGINT_FUNC
int bigint_from_word(bigint* b, bigint_word val);
BIGINT_API
BIGINT_FUNC
int bigint_from_string(bigint* b, const char* str, size_t len, unsigned int base);
/* convenience function for NULL-terminated strings */
BIGINT_API
BIGINT_FUNC
int bigint_from_cstring(bigint* b, const char* str, unsigned int base);
BIGINT_API
BIGINT_FUNC
int bigint_from_u8(bigint* b, uint8_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_i8(bigint* b, int8_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_u16(bigint* b, uint16_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_i16(bigint* b, int16_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_u32(bigint* b, uint32_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_i32(bigint* b, int32_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_u64(bigint* b, uint64_t val);
BIGINT_API
BIGINT_FUNC
int bigint_from_i64(bigint* b, int64_t val);
/* bigint_to functions return 0 on success, 1 if the
* bigint won't fit into the type */
BIGINT_API
BIGINT_FUNC
int bigint_to_u8(uint8_t *val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_i8(int8_t *val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_u16(uint16_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_i16(int16_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_u32(uint32_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_i32(int32_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_u64(uint64_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_to_i64(int64_t * val, const bigint* b);
BIGINT_API
BIGINT_FUNC
size_t bigint_to_string(char* str, size_t len, const bigint* b, unsigned int base);
BIGINT_API
BIGINT_FUNC
int bigint_cmp(const bigint *a, const bigint *b);
#define bigint_lt(a,b) (bigint_cmp((a),(b)) == -1)
@@ -194,41 +183,41 @@ int bigint_cmp(const bigint *a, const bigint *b);
#define bigint_le(a,b) (bigint_cmp((a),(b)) != 1)
#define bigint_ge(a,b) (bigint_cmp((a),(b)) != -1)
BIGINT_API
BIGINT_FUNC
int bigint_inc(bigint* c, const bigint *a);
BIGINT_API
BIGINT_FUNC
int bigint_dec(bigint* c, const bigint *b);
BIGINT_API
BIGINT_FUNC
int bigint_add(bigint* c, const bigint* a, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_sub(bigint* c, const bigint* a, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_mul(bigint* c, const bigint* a, const bigint* b);
BIGINT_API
BIGINT_FUNC
int bigint_div_mod(bigint* quotient, bigint* remainder, const bigint* numerator, const bigint* denominator);
BIGINT_API
BIGINT_FUNC
int bigint_lshift(bigint* c, const bigint* a, size_t bits);
BIGINT_API
BIGINT_FUNC
int bigint_rshift(bigint* c, const bigint* a, size_t bits);
BIGINT_API
BIGINT_FUNC
int bigint_lshift_overwrite(bigint* a, size_t bits);
BIGINT_API
BIGINT_FUNC
int bigint_rshift_overwrite(bigint* a, size_t bits);
/* faster div_mod for when you're dividing by a regular, positive word type - note that this
* overwrites numerator! roughly equivalent to:
* remainder = numerator % denominator
* numerator /= denominator */
BIGINT_API
BIGINT_FUNC
void bigint_div_mod_word(bigint* numerator, bigint_word* remainder, bigint_word denominator);
@@ -694,7 +683,7 @@ int bigint_cmp_abs(const bigint* a, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_lshift_overwrite(bigint* c, size_t bits) {
int r;
size_t words, expanded, i;
@@ -733,7 +722,7 @@ int bigint_lshift_overwrite(bigint* c, size_t bits) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_lshift(bigint* c, const bigint* a, size_t bits) {
int r;
@@ -742,7 +731,7 @@ int bigint_lshift(bigint* c, const bigint* a, size_t bits) {
}
BIGINT_API
BIGINT_FUNC
int bigint_rshift_overwrite(bigint* c, size_t bits) {
int r;
size_t words, i;
@@ -798,7 +787,7 @@ BIGINT_RSHIFT_OVERWRITE_SMALL(4)
BIGINT_RSHIFT_OVERWRITE_SMALL(3)
BIGINT_RSHIFT_OVERWRITE_SMALL(1)
BIGINT_API
BIGINT_FUNC
int bigint_rshift(bigint* c, const bigint* a, size_t bits) {
int r;
if( (r = bigint_copy(c,a)) != 0) return r;
@@ -1060,7 +1049,7 @@ static int bigint_from_string_base0(bigint* b, const char* str, size_t len) {
* 0x1234 (base16)
*/
BIGINT_API
BIGINT_FUNC
int bigint_from_string(bigint* b, const char* str, size_t len, unsigned int base) {
int r = 0;
size_t sign = 0;
@@ -1114,18 +1103,18 @@ int bigint_from_string(bigint* b, const char* str, size_t len, unsigned int base
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_cstring(bigint* b, const char* str, unsigned int base) {
return bigint_from_string(b,str,strlen(str),base);
}
BIGINT_API
BIGINT_FUNC
void bigint_init(bigint* b) {
*b = *BIGINT_ZERO;
b->limit = BIGINT_DEFAULT_LIMIT;
}
BIGINT_API
BIGINT_FUNC
void bigint_free(bigint* b) {
bigint_reset(b);
#ifndef BIGINT_NO_MALLOC
@@ -1137,7 +1126,7 @@ void bigint_free(bigint* b) {
#endif
}
BIGINT_API
BIGINT_FUNC
int bigint_copy(bigint *dest, const bigint *src) {
int r;
size_t limit;
@@ -1164,21 +1153,21 @@ int bigint_copy(bigint *dest, const bigint *src) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_word(bigint* b, bigint_word val) {
bigint_reset(b);
if(!val) return 0;
return bigint_append(b,val);
}
BIGINT_API
BIGINT_FUNC
int bigint_from_u8(bigint* b, uint8_t val) {
bigint_reset(b);
if(!val) return 0;
return bigint_append(b, (bigint_word)(val & BIGINT_WORD_MASK) );
}
BIGINT_API
BIGINT_FUNC
int bigint_from_u16(bigint* b, uint16_t val) {
int r;
bigint_reset(b);
@@ -1195,7 +1184,7 @@ int bigint_from_u16(bigint* b, uint16_t val) {
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_u32(bigint* b, uint32_t val) {
int r;
bigint_reset(b);
@@ -1212,7 +1201,7 @@ int bigint_from_u32(bigint* b, uint32_t val) {
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_u64(bigint* b, uint64_t val) {
int r;
bigint_reset(b);
@@ -1229,7 +1218,7 @@ int bigint_from_u64(bigint* b, uint64_t val) {
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_i8(bigint* b, int8_t val) {
int r;
uint8_t uval = val < 0 ? -val : val;
@@ -1240,7 +1229,7 @@ int bigint_from_i8(bigint* b, int8_t val) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_i16(bigint* b, int16_t val) {
int r;
uint16_t uval = val < 0 ? -val : val;
@@ -1251,7 +1240,7 @@ int bigint_from_i16(bigint* b, int16_t val) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_i32(bigint* b, int32_t val) {
int r;
uint32_t uval = val < 0 ? -val : val;
@@ -1262,7 +1251,7 @@ int bigint_from_i32(bigint* b, int32_t val) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_from_i64(bigint* b, int64_t val) {
int r;
uint64_t uval = val < 0 ? -val : val;
@@ -1290,7 +1279,7 @@ uint64_t bigint_to_u64_internal(const bigint* b) {
return tmp;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_u8(uint8_t *val, const bigint* b) {
uint64_t tmp = 0;
@@ -1302,7 +1291,7 @@ int bigint_to_u8(uint8_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_i8(int8_t *val, const bigint* b) {
uint8_t tmp = 0;
uint8_t max = INT8_MAX;
@@ -1316,7 +1305,7 @@ int bigint_to_i8(int8_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_u16(uint16_t *val, const bigint* b) {
uint64_t tmp = 0;
@@ -1328,7 +1317,7 @@ int bigint_to_u16(uint16_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_i16(int16_t *val, const bigint* b) {
uint16_t tmp = 0;
uint16_t max = INT16_MAX;
@@ -1342,7 +1331,7 @@ int bigint_to_i16(int16_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_u32(uint32_t *val, const bigint* b) {
uint64_t tmp = 0;
@@ -1354,7 +1343,7 @@ int bigint_to_u32(uint32_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_i32(int32_t *val, const bigint* b) {
uint32_t tmp = 0;
uint32_t max = INT32_MAX;
@@ -1368,7 +1357,7 @@ int bigint_to_i32(int32_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_u64(uint64_t *val, const bigint* b) {
uint64_t tmp = 0;
@@ -1380,7 +1369,7 @@ int bigint_to_u64(uint64_t *val, const bigint* b) {
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_to_i64(int64_t *val, const bigint* b) {
uint64_t tmp = 0;
uint64_t max = INT64_MAX;
@@ -1429,7 +1418,7 @@ int bigint_add_signed(bigint* c, const bigint* a, size_t a_sign, const bigint* b
return 0;
}
BIGINT_API
BIGINT_FUNC
int bigint_add(bigint* c, const bigint* a, const bigint* b) {
int r;
bigint tmp = BIGINT_INIT;
@@ -1443,7 +1432,7 @@ int bigint_add(bigint* c, const bigint* a, const bigint* b) {
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_sub(bigint* c, const bigint* a, const bigint* b) {
int r;
bigint tmp = BIGINT_INIT;
@@ -1457,7 +1446,7 @@ int bigint_sub(bigint* c, const bigint* a, const bigint* b) {
return r;
}
BIGINT_API
BIGINT_FUNC
int bigint_mul(bigint* c, const bigint* a, const bigint* b) {
int r;
bigint tmp = BIGINT_INIT;
@@ -1471,7 +1460,7 @@ int bigint_mul(bigint* c, const bigint* a, const bigint* b) {
return r;
}
BIGINT_API
BIGINT_FUNC
void bigint_div_mod_word(bigint* numerator, bigint_word* remainder, bigint_word denominator) {
size_t i;
size_t j;
@@ -1547,7 +1536,7 @@ void bigint_div_mod_ ## x (bigint* numerator, bigint_word* remainder) { \
BIGINT_DIV_MOD_WORD(10)
BIGINT_API
BIGINT_FUNC
int bigint_div_mod(bigint* quotient, bigint* remainder, const bigint* numerator, const bigint* denominator) {
int r;
size_t n;
@@ -1593,12 +1582,12 @@ static const bigint BIGINT_ONE_STORAGE = { .words = (bigint_word*)&BIGINT_ONE_VA
#endif
static const bigint* BIGINT_ONE = &BIGINT_ONE_STORAGE;
BIGINT_API
BIGINT_FUNC
int bigint_inc(bigint* c, const bigint *a) {
return bigint_add(c, a, BIGINT_ONE);
}
BIGINT_API
BIGINT_FUNC
int bigint_dec(bigint* c, const bigint *a) {
return bigint_sub(c, a, BIGINT_ONE);
}
@@ -1725,7 +1714,7 @@ static size_t bigint_to_string_base2(char* str, size_t len, bigint* b) {
return len;
}
BIGINT_API
BIGINT_FUNC
size_t bigint_to_string(char* str, size_t len, const bigint* b, unsigned int base) {
bigint tmp = BIGINT_INIT;
int r;
@@ -1798,7 +1787,7 @@ size_t bigint_to_string(char* str, size_t len, const bigint* b, unsigned int bas
return res;
}
BIGINT_API
BIGINT_FUNC
int bigint_cmp(const bigint *a, const bigint *b) {
if(!a->size && !b->size) return 0;
if(a->sign && b->sign) return bigint_cmp_abs(b,a);