Use double instead of int, () are working, splitted expressionbase out to own file.
[calcinator.git] / main.c
blob4e25c59c27e79765ae8a0340fda631803a105ba9
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
6 #include "expression.h"
7 #include "expressionbase.h"
9 #define MAX 4096
11 int main(int argc, char* argv[]) {
12 int i = 0, factor = 1;
13 unsigned char next;
14 char expression[MAX];
15 ExpressionBase *base = new_expression_base();
16 Expression *expr = malloc(sizeof(Expression)), *prevp;
19 while(next = getchar()) {
20 if(next == '\n') { // We hit end of line, make last expression and break
21 if (get_value(expression)) { // We don't have an empty expression
22 finish_expression(expr, expression, next, factor);
23 add_tail(base, expr);
25 break;
28 if(isdigit(next) || next == '.') { // We hit a number - add that to the stack
29 if (i == 0 && base->last && base->last->op == 0) { // after (
30 base->last->op = '*';
32 expression[i] = next;
33 ++i;
34 } else if ( next == '*' || next == '/' || next == '+' || next == '-' || next == '^') { // We hit an operator, make a new expression
35 if (i == 0) { // after (
36 base->last->op = next;
37 continue;
39 finish_expression(expr, expression, next, factor);
40 add_tail(base, expr);
42 expr = malloc(sizeof(Expression));
43 strncpy(expression, "\0", strlen(expression));
44 i = 0;
45 } else if (next == '(') {
46 if (get_value(expression)) {
47 finish_expression(expr, expression, '*', factor);
48 add_tail(base, expr);
50 expr = malloc(sizeof(Expression));
51 strncpy(expression, "\0", strlen(expression));
52 i = 0;
53 factor *= 10;
54 } else if (next == ')') {
55 finish_expression(expr, expression, 0, factor);
56 add_tail(base, expr);
58 expr = malloc(sizeof(Expression));
59 strncpy(expression, "\0", strlen(expression));
60 i=0;
61 factor /= 10;
62 } else { // We didn't hit a digit or an operator - do nothing
63 continue;
67 for (expr = base->first; expr; expr = expr->next) {
68 evaluate(expr);
69 prevp = expr;
71 printf("= %.1f\n", prevp->value);
72 return 0;