blob: 58442e8c6b67d013450e59246ee43ee563233a23 [file] [log] [blame]
Gavin Howard3eb626f2018-02-14 13:54:35 -07001/*
Gavin Howardb5904bf2018-02-20 13:28:18 -07002 * *****************************************************************************
Gavin Howard3eb626f2018-02-14 13:54:35 -07003 *
Gavin Howardb5904bf2018-02-20 13:28:18 -07004 * Copyright 2018 Gavin D. Howard
Gavin Howard3eb626f2018-02-14 13:54:35 -07005 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 *
Gavin Howardb5904bf2018-02-20 13:28:18 -070017 * *****************************************************************************
Gavin Howard3eb626f2018-02-14 13:54:35 -070018 *
19 * Definitions for the num type.
20 *
21 */
22
23#ifndef BC_NUM_H
24#define BC_NUM_H
25
Gavin Howard3eb626f2018-02-14 13:54:35 -070026#include <stdbool.h>
27#include <stdint.h>
28#include <stdio.h>
29#include <stdlib.h>
30
Gavin Howard3ba6c8d2018-02-15 12:23:35 -070031#include <bc.h>
Gavin Howard3eb626f2018-02-14 13:54:35 -070032
Gavin Howard021150b2018-03-10 15:40:42 -070033typedef signed char BcDigit;
34
Gavin Howardb11bc8a2018-03-01 17:23:00 -070035typedef struct BcNum {
36
Gavin Howard021150b2018-03-10 15:40:42 -070037 BcDigit *num;
Gavin Howardb11bc8a2018-03-01 17:23:00 -070038 size_t rdx;
39 size_t len;
40 size_t cap;
41 bool neg;
42
43} BcNum;
44
Gavin Howard3eb626f2018-02-14 13:54:35 -070045#define BC_NUM_MIN_BASE (2)
46
47#define BC_NUM_MAX_INPUT_BASE (16)
48
Gavin Howard3eb626f2018-02-14 13:54:35 -070049#define BC_NUM_DEF_SIZE (16)
50
51#define BC_NUM_FROM_CHAR(c) ((c) -'0')
52
53#define BC_NUM_TO_CHAR(n) ((n) + '0')
54
Gavin Howard32f2beb2018-03-09 11:43:20 -070055#define BC_NUM_PRINT_WIDTH (69)
Gavin Howard903a1e22018-02-15 16:32:01 -070056
Gavin Howardb11bc8a2018-03-01 17:23:00 -070057#define BC_NUM_ONE(n) ((n)->len == 1 && (n)->rdx == 0 && (n)->num[0] == 1)
Gavin Howard3eb626f2018-02-14 13:54:35 -070058
Gavin Howard9bb13e22018-02-27 17:01:42 -070059typedef BcStatus (*BcNumUnaryFunc)(BcNum*, BcNum*, size_t);
60typedef BcStatus (*BcNumBinaryFunc)(BcNum*, BcNum*, BcNum*, size_t);
Gavin Howard3eb626f2018-02-14 13:54:35 -070061
Gavin Howard1819ecc2018-03-14 01:15:41 -060062typedef BcStatus (*BcNumDigitFunc)(unsigned long, size_t, bool, size_t*, FILE*);
Gavin Howard2682a1f2018-03-03 09:09:13 -070063
Gavin Howard8d1f1db2018-02-23 11:29:41 -070064BcStatus bc_num_init(BcNum *n, size_t request);
Gavin Howardb5c77212018-02-14 17:12:34 -070065
Gavin Howard8d1f1db2018-02-23 11:29:41 -070066BcStatus bc_num_expand(BcNum *n, size_t request);
Gavin Howardb5c77212018-02-14 17:12:34 -070067
Gavin Howarded392aa2018-02-27 13:09:26 -070068void bc_num_free(void *num);
Gavin Howardb5c77212018-02-14 17:12:34 -070069
Gavin Howardf23448c2018-02-27 20:36:24 -070070BcStatus bc_num_copy(void *dest, void *src);
Gavin Howard3eb626f2018-02-14 13:54:35 -070071
Gavin Howard8d1f1db2018-02-23 11:29:41 -070072BcStatus bc_num_long(BcNum *n, long *result);
73BcStatus bc_num_ulong(BcNum *n, unsigned long *result);
Gavin Howard68b8a5c2018-02-15 11:41:24 -070074
Gavin Howard8d1f1db2018-02-23 11:29:41 -070075BcStatus bc_num_long2num(BcNum *n, long val);
76BcStatus bc_num_ulong2num(BcNum *n, unsigned long val);
Gavin Howard8e2cc692018-02-15 17:39:14 -070077
Gavin Howard8d1f1db2018-02-23 11:29:41 -070078BcStatus bc_num_truncate(BcNum *n);
Gavin Howard025d04d2018-02-20 13:53:28 -070079
Gavin Howard8d1f1db2018-02-23 11:29:41 -070080BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *result, size_t scale);
81BcStatus bc_num_sub(BcNum *a, BcNum *b, BcNum *result, size_t scale);
82BcStatus bc_num_mul(BcNum *a, BcNum *b, BcNum *result, size_t scale);
83BcStatus bc_num_div(BcNum *a, BcNum *b, BcNum *result, size_t scale);
84BcStatus bc_num_mod(BcNum *a, BcNum *b, BcNum *result, size_t scale);
Gavin Howard3eb626f2018-02-14 13:54:35 -070085
Gavin Howardd75aaec2018-03-10 20:33:39 -070086// ** Exclude start. **
87BcStatus bc_num_pow(BcNum *a, BcNum *b, BcNum *result, size_t scale);
Gavin Howard8d1f1db2018-02-23 11:29:41 -070088BcStatus bc_num_sqrt(BcNum *a, BcNum *result, size_t scale);
Gavin Howardd75aaec2018-03-10 20:33:39 -070089// ** Exclude end. **
Gavin Howard3eb626f2018-02-14 13:54:35 -070090
Gavin Howard8d1f1db2018-02-23 11:29:41 -070091int bc_num_compare(BcNum *a, BcNum *b);
Gavin Howard3eb626f2018-02-14 13:54:35 -070092
Gavin Howard43a027f2018-02-26 13:27:10 -070093void bc_num_zero(BcNum *n);
94void bc_num_one(BcNum *n);
Gavin Howard5d74e962018-02-26 13:44:13 -070095void bc_num_ten(BcNum *n);
Gavin Howard43a027f2018-02-26 13:27:10 -070096
Gavin Howardd75aaec2018-03-10 20:33:39 -070097// ** Exclude start. **
98BcStatus bc_num_parse(BcNum *n, const char *val, BcNum *base, size_t base_t);
99
100BcStatus bc_num_print(BcNum *n, BcNum *base, size_t base_t, bool newline);
101BcStatus bc_num_fprint(BcNum *n, BcNum *base, size_t base_t,
102 bool newline, FILE *f);
103// ** Exclude end. **
104
Gavin Howardf456d372018-03-10 20:11:41 -0700105extern const char bc_num_hex_digits[];
106
Gavin Howard3eb626f2018-02-14 13:54:35 -0700107#endif // BC_NUM_H