]> git.xonotic.org Git - xonotic/gmqcc.git/blob - astir.h
ir.c: importing ir_block
[xonotic/gmqcc.git] / astir.h
1 #ifndef ASTIR_COMMON_H__
2 #define ASTIR_COMMON_H__
3
4 #define MEM_VECTOR_PROTO(Towner, Tmem, mem)        \
5     void Towner##_##mem##_add(Towner*, Tmem);      \
6     void Towner##_##mem##_remove(Towner*, size_t);
7
8 #define MEM_VECTOR_PROTO_ALL(Towner, Tmem, mem)          \
9     MEM_VECTOR_PROTO(Towner, Towner, Tmem, mem)          \
10     qbool Towner##_##mem##_find(Towner*, Tmem, size_t*); \
11     void Towner##_##mem##_clear(Towner*);
12
13 #define MEM_VECTOR_MAKE(Twhat, name) \
14     Twhat  *name;                    \
15     size_t name##_count;             \
16     size_t name##_alloc
17
18 #define _MEM_VEC_FUN_ADD(Tself, Twhat, mem)       \
19 void Tself##_##mem##_add(Tself *self, Twhat f)    \
20 {                                                 \
21     if (self->mem##_count == self->mem##_alloc) { \
22         if (!self->mem##_alloc)                   \
23             self->mem##_alloc = 16;               \
24         else                                      \
25             self->mem##_alloc *= 2;               \
26         self->mem = (Twhat*)realloc(self->mem,    \
27             sizeof(Twhat) * self->mem##_alloc);   \
28     }                                             \
29     self->mem[self->mem##_count++] = f;           \
30 }
31
32 #define _MEM_VEC_FUN_REMOVE(Tself, Twhat, mem)       \
33 void Tself##_##mem##_remove(Tself *self, size_t idx) \
34 {                                                    \
35     size_t i;                                        \
36     if (idx >= self->mem##_count)                    \
37         return;                                      \
38     for (i = idx; i < self->mem##_count-1; ++i)      \
39         self->mem[i] = self->mem[i+1];               \
40     self->mem##_count--;                             \
41     if (self->mem##_count < self->mem##_count/2)     \
42     {                                                \
43         self->mem##_alloc /= 2;                      \
44         self->mem = (Twhat*)realloc(self->mem,       \
45             self->mem##_alloc * sizeof(Twhat));      \
46     }                                                \
47 }
48
49 #define _MEM_VEC_FUN_FIND(Tself, Twhat, mem)                    \
50 qbool Tself##_##mem##_find(Tself *self, Twhat obj, size_t *idx) \
51 {                                                               \
52     size_t i;                                                   \
53     for (i = 0; i < self->mem##_count; ++i) {                   \
54         if (self->mem[i] == obj) {                              \
55             if (idx)                                            \
56                 *idx = i;                                       \
57             return itrue;                                       \
58         }                                                       \
59     }                                                           \
60     return ifalse;                                              \
61 }
62
63 #define _MEM_VEC_FUN_CLEAR(Tself, mem)  \
64 void Tself##_##mem##_clear(Tself *self) \
65 {                                       \
66     if (!self->mem)                     \
67         return;                         \
68     free((void*) self->mem);            \
69     self->mem = NULL;                   \
70     self->mem##_count = 0;              \
71     self->mem##_alloc = 0;              \
72 }
73
74 #define MEM_VECTOR_CLEAR(owner, mem) \
75     if ((owner)->mem)                \
76         free((void*)((owner)->mem)); \
77     (owner)->mem = NULL;             \
78     (owner)->mem##_count = 0;        \
79     (owner)->mem##_alloc = 0
80
81 #define MEM_VECTOR_INIT(owner, mem) \
82 {                                   \
83     (owner)->mem = NULL;            \
84     (owner)->mem##_count = 0;       \
85     (owner)->mem##_alloc = 0;       \
86 }
87
88 #define MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
89 _MEM_VEC_FUN_REMOVE(Tself, Twhat, mem)       \
90 _MEM_VEC_FUN_ADD(Tself, Twhat, mem)
91
92 #define MEM_VEC_FUNCTIONS_ALL(Tself, Twhat, mem) \
93 MEM_VEC_FUNCTIONS(Tself, Twhat, mem)             \
94 _MEM_VEC_FUN_CLEAR(Tself, Twhat, mem)            \
95 _MEM_VEC_FUN_FIND(Tself, Twhat, mem)
96
97 typedef enum { false, true } qbool;
98
99 enum qc_types {
100     /* Main QC types */
101     qc_void,
102     qc_float,
103     qc_vector,
104     qc_entity,
105     qc_string,
106     qc_int,
107
108     /* "virtual" and internal types */
109     qc_pointer,
110     qc_variant, /* eg. OFS_RETURN/PARAM... */
111     qc_function,
112 };
113
114 enum store_types {
115     store_global,
116     store_local,  /* local, assignable for now, should get promoted later */
117     store_value,  /* unassignable */
118 };
119
120 typedef struct {
121     float x, y, z;
122 } vector_t;
123
124 /* A shallow copy of a lex_file to remember where which ast node
125  * came from.
126  */
127 typedef struct lex_ctx
128 {
129     const char *file;
130     size_t     line;
131 } lex_ctx_t;
132
133 #endif