summaryrefslogtreecommitdiff
path: root/bc.h
blob: 2bc9d5e3d33263bf0697cb246d4d9e65738898d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define _XOPEN_SOURCE 700
#include <inttypes.h>

typedef enum {
	MUL, MOD, DIV, ADD, SUB, POW, NEG,
	SET, SADD, SSUB, SMUL, SDIV, SMOD, SPOW,
	EQ, LE, GE, NE, LT, GT,
	INC, DEC
} bc_op;

typedef enum {
	DEFINE, BREAK, QUIT, LENGTH,
	RETURN, FOR, IF, WHILE, SQRT,
	SCALE, IBASE, OBASE, AUTO
} bc_kw;

typedef struct {
	int scale;
	intmax_t n;
} bc_num;

typedef struct bc_expression {
	enum bc_expression_type {
		NAMED, LITERAL, FUNCTION_CALL, OPERATION
	} type;
	char letter;
	struct bc_expression *left;
	struct bc_expression *right;
	bc_num *literal;
	bc_num *lval;
	bc_num *rval;
	bc_op op;
} bc_expression;

extern int bc_lineno;
extern int bc_char;

bc_num *bc_eval(bc_expression *);
bc_expression *bc_named(char);
bc_expression *bc_literal(bc_num *);
bc_expression *bc_function_call(char, void*);
bc_expression *bc_operation(bc_op, bc_expression *, bc_expression *);

bc_num *bc_new(const char *);
void bc_free(bc_num *);
bc_num *bc_print(bc_num *);
int bc_toint(bc_num *);

/* basic operations */
bc_num *bc_mul(bc_num *, bc_num *);
bc_num *bc_add(bc_num *, bc_num *);
bc_num *bc_sub(bc_num *, bc_num *);
bc_num *bc_div(bc_num *, bc_num *);
bc_num *bc_mod(bc_num *, bc_num *);
bc_num *bc_pow(bc_num *, bc_num *);
bc_num *bc_neg(bc_num *);

/* modifying operations */
bc_num *bc_inc(bc_num *);
bc_num *bc_dec(bc_num *);
bc_num *bc_set(bc_num *, bc_num *);
bc_num *bc_sadd(bc_num *, bc_num *);
bc_num *bc_ssub(bc_num *, bc_num *);
bc_num *bc_smul(bc_num *, bc_num *);
bc_num *bc_sdiv(bc_num *, bc_num *);
bc_num *bc_smod(bc_num *, bc_num *);
bc_num *bc_spow(bc_num *, bc_num *);

/* relation operations */
bc_num *bc_eq(bc_num *, bc_num *);
bc_num *bc_le(bc_num *, bc_num *);
bc_num *bc_ge(bc_num *, bc_num *);
bc_num *bc_ne(bc_num *, bc_num *);
bc_num *bc_lt(bc_num *, bc_num *);
bc_num *bc_gt(bc_num *, bc_num *);

/* variables */
bc_num *bc_let(char);
bc_num *bc_arr(char, bc_num *);

/* built-in functions */
bc_num *bc_length(bc_num *);
bc_num *bc_sqrt(bc_num *);
bc_num *bc_scale(bc_num *);