diff options
Diffstat (limited to 'include/bcl.h')
-rw-r--r-- | include/bcl.h | 325 |
1 files changed, 229 insertions, 96 deletions
diff --git a/include/bcl.h b/include/bcl.h index 833592c4..0908e215 100644 --- a/include/bcl.h +++ b/include/bcl.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2021 Gavin D. Howard and contributors. + * Copyright (c) 2018-2023 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -36,50 +36,29 @@ #ifndef BC_BCL_H #define BC_BCL_H -#ifdef _WIN32 -#include <Windows.h> -#include <BaseTsd.h> -#include <stdio.h> -#include <io.h> -#endif // _WIN32 +// TODO: Add a generation index when building with Valgrind to check for +// use-after-free's or double frees. #include <stdbool.h> #include <stdlib.h> #include <limits.h> #include <stdint.h> -#include <sys/types.h> -// Windows has deprecated isatty() and the rest of these. Or doesn't have them. -// So these are just fixes for Windows. +#ifndef NDEBUG +#define BC_DEBUG (1) +#else // NDEBUG +#define BC_DEBUG (0) +#endif // NDEBUG + #ifdef _WIN32 +#include <Windows.h> +#include <BaseTsd.h> +#include <stdio.h> +#include <io.h> +#endif // _WIN32 -// This one is special. Windows did not like me defining an -// inline function that was not given a definition in a header -// file. This suppresses that by making inline functions non-inline. -#define inline - -#define restrict __restrict -#define strdup _strdup -#define write(f, b, s) _write((f), (b), (unsigned int) (s)) -#define read(f, b, s) _read((f), (b), (unsigned int) (s)) -#define close _close -#define open(f, n, m) _sopen_s(f, n, m, _SH_DENYNO, _S_IREAD | _S_IWRITE) -#define sigjmp_buf jmp_buf -#define sigsetjmp(j, s) setjmp(j) -#define siglongjmp longjmp -#define isatty _isatty -#define STDIN_FILENO _fileno(stdin) -#define STDOUT_FILENO _fileno(stdout) -#define STDERR_FILENO _fileno(stderr) +#ifdef _WIN32 #define ssize_t SSIZE_T -#define S_ISDIR(m) ((m) & _S_IFDIR) -#define O_RDONLY _O_RDONLY -#define stat _stat -#define fstat _fstat -#define BC_FILE_SEP '\\' - -#else // _WIN32 -#define BC_FILE_SEP '/' #endif // _WIN32 #define BCL_SEED_ULONGS (4) @@ -128,8 +107,8 @@ typedef uint32_t BclRandInt; #if BC_ENABLE_LIBRARY -typedef enum BclError { - +typedef enum BclError +{ BCL_ERROR_NONE, BCL_ERROR_INVALID_NUM, @@ -150,8 +129,8 @@ typedef enum BclError { } BclError; -typedef struct BclNumber { - +typedef struct BclNumber +{ size_t i; } BclNumber; @@ -160,79 +139,233 @@ struct BclCtxt; typedef struct BclCtxt* BclContext; -void bcl_handleSignal(void); -bool bcl_running(void); +BclError +bcl_start(void); + +void +bcl_end(void); + +BclError +bcl_init(void); + +void +bcl_free(void); + +bool +bcl_abortOnFatalError(void); + +void +bcl_setAbortOnFatalError(bool abrt); + +bool +bcl_leadingZeroes(void); + +void +bcl_setLeadingZeroes(bool leadingZeroes); + +bool +bcl_digitClamp(void); + +void +bcl_setDigitClamp(bool digitClamp); + +void +bcl_gc(void); + +BclError +bcl_pushContext(BclContext ctxt); + +void +bcl_popContext(void); + +BclContext +bcl_context(void); + +BclContext +bcl_ctxt_create(void); + +void +bcl_ctxt_free(BclContext ctxt); + +void +bcl_ctxt_freeNums(BclContext ctxt); + +size_t +bcl_ctxt_scale(BclContext ctxt); + +void +bcl_ctxt_setScale(BclContext ctxt, size_t scale); + +size_t +bcl_ctxt_ibase(BclContext ctxt); + +void +bcl_ctxt_setIbase(BclContext ctxt, size_t ibase); + +size_t +bcl_ctxt_obase(BclContext ctxt); + +void +bcl_ctxt_setObase(BclContext ctxt, size_t obase); + +BclError +bcl_err(BclNumber n); + +BclNumber +bcl_num_create(void); + +void +bcl_num_free(BclNumber n); + +bool +bcl_num_neg(BclNumber n); + +void +bcl_num_setNeg(BclNumber n, bool neg); + +size_t +bcl_num_scale(BclNumber n); + +BclError +bcl_num_setScale(BclNumber n, size_t scale); + +size_t +bcl_num_len(BclNumber n); + +BclError +bcl_copy(BclNumber d, BclNumber s); + +BclNumber +bcl_dup(BclNumber s); + +BclError +bcl_bigdig(BclNumber n, BclBigDig* result); + +BclError +bcl_bigdig_keep(BclNumber n, BclBigDig* result); + +BclNumber +bcl_bigdig2num(BclBigDig val); + +BclNumber +bcl_add(BclNumber a, BclNumber b); + +BclNumber +bcl_add_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_sub(BclNumber a, BclNumber b); + +BclNumber +bcl_sub_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_mul(BclNumber a, BclNumber b); + +BclNumber +bcl_mul_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_div(BclNumber a, BclNumber b); + +BclNumber +bcl_div_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_mod(BclNumber a, BclNumber b); + +BclNumber +bcl_mod_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_pow(BclNumber a, BclNumber b); + +BclNumber +bcl_pow_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_lshift(BclNumber a, BclNumber b); + +BclNumber +bcl_lshift_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_rshift(BclNumber a, BclNumber b); + +BclNumber +bcl_rshift_keep(BclNumber a, BclNumber b); + +BclNumber +bcl_sqrt(BclNumber a); + +BclNumber +bcl_sqrt_keep(BclNumber a); + +BclError +bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d); + +BclError +bcl_divmod_keep(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d); + +BclNumber +bcl_modexp(BclNumber a, BclNumber b, BclNumber c); + +BclNumber +bcl_modexp_keep(BclNumber a, BclNumber b, BclNumber c); + +ssize_t +bcl_cmp(BclNumber a, BclNumber b); -BclError bcl_init(void); -void bcl_free(void); +void +bcl_zero(BclNumber n); -bool bcl_abortOnFatalError(void); -void bcl_setAbortOnFatalError(bool abrt); +void +bcl_one(BclNumber n); -void bcl_gc(void); +BclNumber +bcl_parse(const char* restrict val); -BclError bcl_pushContext(BclContext ctxt); -void bcl_popContext(void); -BclContext bcl_context(void); +char* +bcl_string(BclNumber n); -BclContext bcl_ctxt_create(void); -void bcl_ctxt_free(BclContext ctxt); -void bcl_ctxt_freeNums(BclContext ctxt); +char* +bcl_string_keep(BclNumber n); -size_t bcl_ctxt_scale(BclContext ctxt); -void bcl_ctxt_setScale(BclContext ctxt, size_t scale); -size_t bcl_ctxt_ibase(BclContext ctxt); -void bcl_ctxt_setIbase(BclContext ctxt, size_t ibase); -size_t bcl_ctxt_obase(BclContext ctxt); -void bcl_ctxt_setObase(BclContext ctxt, size_t obase); +BclNumber +bcl_irand(BclNumber a); -BclError bcl_err(BclNumber n); +BclNumber +bcl_irand_keep(BclNumber a); -BclNumber bcl_num_create(void); -void bcl_num_free(BclNumber n); +BclNumber +bcl_frand(size_t places); -bool bcl_num_neg(BclNumber n); -void bcl_num_setNeg(BclNumber n, bool neg); -size_t bcl_num_scale(BclNumber n); -BclError bcl_num_setScale(BclNumber n, size_t scale); -size_t bcl_num_len(BclNumber n); +BclNumber +bcl_ifrand(BclNumber a, size_t places); -BclError bcl_copy(BclNumber d, BclNumber s); -BclNumber bcl_dup(BclNumber s); +BclNumber +bcl_ifrand_keep(BclNumber a, size_t places); -BclError bcl_bigdig(BclNumber n, BclBigDig *result); -BclNumber bcl_bigdig2num(BclBigDig val); +BclError +bcl_rand_seedWithNum(BclNumber n); -BclNumber bcl_add(BclNumber a, BclNumber b); -BclNumber bcl_sub(BclNumber a, BclNumber b); -BclNumber bcl_mul(BclNumber a, BclNumber b); -BclNumber bcl_div(BclNumber a, BclNumber b); -BclNumber bcl_mod(BclNumber a, BclNumber b); -BclNumber bcl_pow(BclNumber a, BclNumber b); -BclNumber bcl_lshift(BclNumber a, BclNumber b); -BclNumber bcl_rshift(BclNumber a, BclNumber b); -BclNumber bcl_sqrt(BclNumber a); -BclError bcl_divmod(BclNumber a, BclNumber b, BclNumber *c, BclNumber *d); -BclNumber bcl_modexp(BclNumber a, BclNumber b, BclNumber c); +BclError +bcl_rand_seedWithNum_keep(BclNumber n); -ssize_t bcl_cmp(BclNumber a, BclNumber b); +BclError +bcl_rand_seed(unsigned char seed[BCL_SEED_SIZE]); -void bcl_zero(BclNumber n); -void bcl_one(BclNumber n); +void +bcl_rand_reseed(void); -BclNumber bcl_parse(const char *restrict val); -char* bcl_string(BclNumber n); +BclNumber +bcl_rand_seed2num(void); -BclNumber bcl_irand(BclNumber a); -BclNumber bcl_frand(size_t places); -BclNumber bcl_ifrand(BclNumber a, size_t places); +BclRandInt +bcl_rand_int(void); -BclError bcl_rand_seedWithNum(BclNumber n); -BclError bcl_rand_seed(unsigned char seed[BCL_SEED_SIZE]); -void bcl_rand_reseed(void); -BclNumber bcl_rand_seed2num(void); -BclRandInt bcl_rand_int(void); -BclRandInt bcl_rand_bounded(BclRandInt bound); +BclRandInt +bcl_rand_bounded(BclRandInt bound); #endif // BC_ENABLE_LIBRARY |