summaryrefslogtreecommitdiff
path: root/bc.h
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-13 20:59:41 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-13 20:59:41 -0400
commit8ab5902d2cb66809d478ef795a878a413dea41cc (patch)
treea2d4f9cba84dbb481d4c988537f608c8e788f710 /bc.h
migrate to gitlab
Diffstat (limited to 'bc.h')
-rw-r--r--bc.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/bc.h b/bc.h
new file mode 100644
index 0000000..2bc9d5e
--- /dev/null
+++ b/bc.h
@@ -0,0 +1,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 *);