aboutsummaryrefslogtreecommitdiff
path: root/bank.c
diff options
context:
space:
mode:
Diffstat (limited to 'bank.c')
-rw-r--r--bank.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/bank.c b/bank.c
new file mode 100644
index 0000000..02b4522
--- /dev/null
+++ b/bank.c
@@ -0,0 +1,41 @@
+#include <stdint.h>
+#include "bignum.h"
+
+char would_overflow(unsigned long value, unsigned long amount) {
+ return ((UINT32_MAX - amount) <= value);
+}
+
+char bank_withdraw(long amount) {
+ bignum(bigamt);
+
+ if(amount < 0) {
+ /* can't withdraw all, if too much in bank */
+ if(big_cmp(&bank, B_MAXLONG) == 1)
+ return 0;
+
+ big_copy(&bigamt, &bank);
+ big_to_ulong(&bigamt, &amount);
+ }
+
+ if(would_overflow(cash, amount)) return 0;
+
+ cash += amount;
+ ulong_to_big(&amount, &bigamt);
+ big_sub(&bank, &bank, &bigamt);
+
+ return 1;
+}
+
+void bank_deposit(long amount) {
+ bignum bigamt;
+
+ if(amount < 0) amount = cash;
+
+ cash -= amount;
+ ulong_to_big(&amount, &bigamt);
+ big_add(&bank, &bank, &bigamt);
+}
+
+void bank_interest(void) {
+ big_mul(&bank, &bank, &interest_rate);
+}