blob: b85492868b7fdf0782fa022db78c7f3022ebcf40 [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
33#define BC_NUM_MIN_BASE (2)
34
35#define BC_NUM_MAX_INPUT_BASE (16)
36
37#define BC_NUM_MAX_OUTPUT_BASE (99)
38
39#define BC_NUM_DEF_SIZE (16)
40
41#define BC_NUM_FROM_CHAR(c) ((c) -'0')
42
43#define BC_NUM_TO_CHAR(n) ((n) + '0')
44
Gavin Howarda83e3dc2018-02-15 18:57:08 -070045#define BC_NUM_SCALE(n) ((n)->len - (n)->rdx)
Gavin Howardfe679f02018-02-14 15:50:09 -070046
Gavin Howard903a1e22018-02-15 16:32:01 -070047#define BC_NUM_PRINT_WIDTH (68)
48
Gavin Howard3eb626f2018-02-14 13:54:35 -070049typedef struct BcNum {
50
51 char* num;
Gavin Howard8389bb22018-02-15 17:40:34 -070052 size_t rdx;
Gavin Howard3eb626f2018-02-14 13:54:35 -070053 size_t len;
Gavin Howard6f6dc942018-02-15 16:58:50 -070054 size_t cap;
Gavin Howard3eb626f2018-02-14 13:54:35 -070055 bool neg;
56
57} BcNum;
58
59typedef BcStatus (*BcUnaryFunc)(BcNum* a, BcNum* res, size_t scale);
60typedef BcStatus (*BcBinaryFunc)(BcNum* a, BcNum* b, BcNum* res, size_t scale);
61
Gavin Howard8389bb22018-02-15 17:40:34 -070062BcStatus bc_num_init(BcNum* n, size_t request);
Gavin Howardb5c77212018-02-14 17:12:34 -070063
Gavin Howard0b465d02018-02-15 11:41:16 -070064BcStatus bc_num_expand(BcNum* n, size_t request);
Gavin Howardb5c77212018-02-14 17:12:34 -070065
Gavin Howard8389bb22018-02-15 17:40:34 -070066void bc_num_free(BcNum* n);
Gavin Howardb5c77212018-02-14 17:12:34 -070067
Gavin Howard0b465d02018-02-15 11:41:16 -070068BcStatus bc_num_copy(BcNum* d, BcNum* s);
Gavin Howard3eb626f2018-02-14 13:54:35 -070069
Gavin Howard0b465d02018-02-15 11:41:16 -070070BcStatus bc_num_parse(BcNum* n, const char* val,
Gavin Howard3eb626f2018-02-14 13:54:35 -070071 size_t base, size_t scale);
72
Gavin Howard0b465d02018-02-15 11:41:16 -070073BcStatus bc_num_print(BcNum* n, size_t base);
74BcStatus bc_num_fprint(BcNum* n, size_t base, FILE* f);
Gavin Howard3eb626f2018-02-14 13:54:35 -070075
Gavin Howard68b8a5c2018-02-15 11:41:24 -070076BcStatus bc_num_long(BcNum* n, long* result);
77BcStatus bc_num_ulong(BcNum* n, unsigned long* result);
78
Gavin Howard8e2cc692018-02-15 17:39:14 -070079BcStatus bc_num_long2num(BcNum* n, long val);
80BcStatus bc_num_ulong2num(BcNum* n, unsigned long val);
81
Gavin Howard3eb626f2018-02-14 13:54:35 -070082BcStatus bc_num_add(BcNum* a, BcNum* b, BcNum* result, size_t scale);
83BcStatus bc_num_sub(BcNum* a, BcNum* b, BcNum* result, size_t scale);
84BcStatus bc_num_mul(BcNum* a, BcNum* b, BcNum* result, size_t scale);
85BcStatus bc_num_div(BcNum* a, BcNum* b, BcNum* result, size_t scale);
86BcStatus bc_num_mod(BcNum* a, BcNum* b, BcNum* result, size_t scale);
87BcStatus bc_num_pow(BcNum* a, BcNum* b, BcNum* result, size_t scale);
88
89BcStatus bc_num_sqrt(BcNum* a, BcNum* result, size_t scale);
90
91bool bc_num_isInteger(BcNum* num);
92
93int bc_num_compare(BcNum* a, BcNum* b);
94
Gavin Howard3eb626f2018-02-14 13:54:35 -070095#endif // BC_NUM_H