aboutsummaryrefslogtreecommitdiff
path: root/include/bcl.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/bcl.h')
-rw-r--r--include/bcl.h325
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