]> git.xonotic.org Git - xonotic/gmqcc.git/blob - ir.c
Space indentation in ir.c builder part
[xonotic/gmqcc.git] / ir.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "ir.h"
4
5 ir_builder* ir_builder_new(const char *modulename)
6 {
7     ir_builder* self;
8
9     self = (ir_builder*)mem_a(sizeof(*self));
10     MEM_VECTOR_INIT(self, functions);
11     MEM_VECTOR_INIT(self, globals);
12     self->name = NULL;
13     ir_builder_set_name(self, modulename);
14
15     /* globals which always exist */
16
17     /* for now we give it a vector size */
18     ir_builder_create_global(self, "OFS_RETURN", qc_variant);
19
20     return self;
21 }
22
23 MEM_VEC_FUNCTIONS(ir_builder, ir_value*, globals)
24 MEM_VECTOR_FUNCTIONS(ir_builder, ir_function*, functions)
25
26 void ir_builder_delete(ir_builder* self)
27 {
28     size_t i;
29     mem_d((void*)self->name);
30     for (i = 0; i != self->functions_count; ++i) {
31         ir_function_delete(self->functions[i]);
32     }
33     VEC_CLEAR(self, functions);
34     for (i = 0; i != self->globals_count; ++i) {
35         ir_value_delete(self->globals[i]);
36     }
37     VEC_CLEAR(self, globals);
38     mem_d(self);
39 }
40
41 void ir_builder_set_name(ir_builder *self, const char *name)
42 {
43     if (self->name)
44         mem_d((void*)self->name);
45     self->name = util_strdup(name);
46 }
47
48 ir_function* ir_builder_get_function(ir_builder *self, const char *name)
49 {
50     size_t i;
51     for (i = 0; i < self->functions_count; ++i) {
52         if (!strcmp(name, self->functions[i]->name))
53             return self->functions[i];
54     }
55     return NULL;
56 }
57
58 ir_function* ir_builder_create_function(ir_builder *self, const char *name)
59 {
60     ir_function *fn = ir_builder_get_function(self, name);
61     if (fn) {
62         return NULL;
63     }
64
65     fn = ir_function_new(self);
66     ir_function_set_name(fn, name);
67     ir_builder_functions_add(self, fn);
68     return fn;
69 }
70
71 ir_value* ir_builder_get_global(ir_builder *self, const char *name)
72 {
73     size_t i;
74     for (i = 0; i < self->globals_count; ++i) {
75         if (!strcmp(self->globals[i]->name, name))
76             return self->globals[i];
77     }
78     return NULL;
79 }
80
81 ir_value* ir_builder_create_global(ir_builder *self, const char *name, ir_type_t vtype)
82 {
83     ir_value *ve = ir_builder_get_global(self, name);
84     if (ve) {
85         return NULL;
86     }
87
88     ve = ir_value_var(name, qc_global, vtype);
89     ir_builder_globals_add(self, ve);
90     return ve;
91 }