aboutsummaryrefslogtreecommitdiff
path: root/src/all.h
blob: 7456824c01546f0ae947d859d5a8f2333a3e0680 (plain) (blame)
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
85
86
87
88
89
90
91
92
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>

typedef struct {
  long long *_data;
  size_t _cap;
  size_t len;
} ivec;

typedef struct {
  char *data;
  size_t length;
  size_t capacity;
} str;

typedef struct ast_node ast_node_t;

typedef struct {
  ast_node_t **_data;
  size_t _cap;
  size_t len;
} node_vec;

// Parser/AST

typedef struct ast_node ast_node_t;

typedef enum {
  AST_INC,
  AST_DEC,
  AST_PTR_INC,
  AST_PTR_DEC,
  AST_OUT,
  AST_IN,
  AST_LOOP,
  AST_CLEAR
} ast_type_e;

struct ast_node {
  ast_type_e type;
  int val;

  node_vec children; // vec<ast_node_t*>
  ast_node_t *next;
};

ast_node_t *parse(const char *src);
ast_node_t *optimize_ast(ast_node_t *ast);
void ast_free(ast_node_t *node);
void ast_dump(ast_node_t *node, int depth);

// codegen

str gen_code(ast_node_t *ast);

void iv_free(ivec *v);
size_t iv_push(ivec *v, long long data);
long long iv_get(ivec *v, size_t idx);
long long iv_rem_shift(ivec *v, size_t idx);
long long iv_rem(ivec *v, size_t idx);
long long iv_has(ivec *v, long long x,
                 int (*comp)(const long long, const long long));
void iv_shrink(ivec *v);

void node_vec_free(node_vec *v);

size_t node_vec_push(node_vec *v, ast_node_t *data);

ast_node_t *node_vec_get(node_vec *v, size_t idx);

ast_node_t *node_vec_rem_shift(node_vec *v, size_t idx);

ast_node_t *node_vec_rem(node_vec *v, size_t idx);

ast_node_t *node_vec_has(node_vec *v, ast_node_t *x,
                         int (*comp)(const ast_node_t *, const ast_node_t *));

void node_vec_shrink(node_vec *v);

void free_str(str *s);

void str_append(str *s, const char *from);
void str_append_c(str *s, char c);
void str_append_len(str *s, const char *from, size_t len);

void str_append_read(str *s, int fd);
void str_append_fread(str *s, FILE *file);
void str_append_fread_len(str *s, size_t size, FILE *file);

void str_appendf(str *s, const char *fmt, ...);