summaryrefslogtreecommitdiff
path: root/tree.c
blob: b53ece2cdf530203ea7c51b774a35b691c981951 (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
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"

int strichar(const char *str, char c){
  for(int i=0; str[i]!='\0';i++){
    if(str[i] == c) return i;
  }
  return -1; //char not found
}
const char ops[] = {'+','*','!'}; //ordem inversa
const int opsize = sizeof(ops)/sizeof(char);
node * parse(char *str) { //expects a string with no whitespace

  int j,i;
  for(i=0; i<opsize; i++){
    j=strichar(str,ops[i]);
    if(j>=0) break;
  }

  node *this = (node *)malloc(sizeof(node));

  if(j<0) {
    this->type = LTTR;
    this->el = str[0];
  }

  else{
    this->el = ops[i];
    if(i==2) {
      this->type = UNOP;
      this->child[0] = parse(str+j+1);
    }
    else {
      str[j] = '\0';
      this->type = BIOP;
      this->child[0] = parse(str);
      this->child[1] = parse(str+j+1);
    }
  }
  return this;
}

void fprintTree(FILE *stream, node *root, int level) {
  if (root == NULL)
    return;

  if (level) {
    for (int i = 1; i < level; i++) {
      fprintf(stream, "│  ");
    }
    fprintf(stream, "├─ ");
  }
  fprintf(stream, "%c\n", root->el);
  for (int i = 0; i < 2; i++) {
    if (root->child[i] != NULL) {
      fprintTree(stream, root->child[i], level + 1);
    }
  }
}

void printTree(node *root, int level) {
  fprintTree(stdout, root, level);
}