melbourne 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. data/HISTORY +3 -0
  2. data/LICENSE +27 -0
  3. data/README.rdoc +38 -0
  4. data/Rakefile +38 -0
  5. data/VERSION.yml +4 -0
  6. data/ext/melbourne/bstring-license.txt +29 -0
  7. data/ext/melbourne/bstrlib.c +2918 -0
  8. data/ext/melbourne/bstrlib.h +302 -0
  9. data/ext/melbourne/extconf.rb +76 -0
  10. data/ext/melbourne/grammar.cpp +11885 -0
  11. data/ext/melbourne/grammar.hpp +14 -0
  12. data/ext/melbourne/grammar.y +6013 -0
  13. data/ext/melbourne/internal.hpp +137 -0
  14. data/ext/melbourne/lex.c.tab +136 -0
  15. data/ext/melbourne/local_state.hpp +41 -0
  16. data/ext/melbourne/melbourne.cpp +37 -0
  17. data/ext/melbourne/node.hpp +262 -0
  18. data/ext/melbourne/node_types.cpp +245 -0
  19. data/ext/melbourne/node_types.hpp +135 -0
  20. data/ext/melbourne/node_types.rb +190 -0
  21. data/ext/melbourne/quark.cpp +52 -0
  22. data/ext/melbourne/quark.hpp +14 -0
  23. data/ext/melbourne/symbols.cpp +219 -0
  24. data/ext/melbourne/symbols.hpp +116 -0
  25. data/ext/melbourne/var_table.cpp +113 -0
  26. data/ext/melbourne/var_table.hpp +33 -0
  27. data/ext/melbourne/visitor.cpp +1052 -0
  28. data/ext/melbourne/visitor.hpp +20 -0
  29. data/lib/melbourne/ast/constants.rb +128 -0
  30. data/lib/melbourne/ast/control_flow.rb +382 -0
  31. data/lib/melbourne/ast/data.rb +19 -0
  32. data/lib/melbourne/ast/definitions.rb +561 -0
  33. data/lib/melbourne/ast/exceptions.rb +182 -0
  34. data/lib/melbourne/ast/file.rb +15 -0
  35. data/lib/melbourne/ast/grapher.rb +75 -0
  36. data/lib/melbourne/ast/literals.rb +268 -0
  37. data/lib/melbourne/ast/node.rb +21 -0
  38. data/lib/melbourne/ast/operators.rb +117 -0
  39. data/lib/melbourne/ast/self.rb +17 -0
  40. data/lib/melbourne/ast/sends.rb +451 -0
  41. data/lib/melbourne/ast/values.rb +74 -0
  42. data/lib/melbourne/ast/variables.rb +251 -0
  43. data/lib/melbourne/ast.rb +22 -0
  44. data/lib/melbourne/parser.rb +38 -0
  45. data/lib/melbourne/processor.rb +460 -0
  46. data/lib/melbourne.rb +46 -0
  47. data/spec/helpers/ast/node.rb +15 -0
  48. data/spec/helpers/ast/reduced_graph.rb +64 -0
  49. data/spec/lib/parser/alias_spec.rb +97 -0
  50. data/spec/lib/parser/and_spec.rb +63 -0
  51. data/spec/lib/parser/array_spec.rb +157 -0
  52. data/spec/lib/parser/attrasgn_spec.rb +401 -0
  53. data/spec/lib/parser/back_ref_spec.rb +20 -0
  54. data/spec/lib/parser/call_spec.rb +958 -0
  55. data/spec/lib/parser/case_spec.rb +577 -0
  56. data/spec/lib/parser/cdecl_spec.rb +108 -0
  57. data/spec/lib/parser/class_spec.rb +221 -0
  58. data/spec/lib/parser/colon2_spec.rb +13 -0
  59. data/spec/lib/parser/colon3_spec.rb +12 -0
  60. data/spec/lib/parser/const_spec.rb +12 -0
  61. data/spec/lib/parser/cvar_spec.rb +55 -0
  62. data/spec/lib/parser/cvasgn_spec.rb +71 -0
  63. data/spec/lib/parser/cvdecl_spec.rb +31 -0
  64. data/spec/lib/parser/defined_spec.rb +353 -0
  65. data/spec/lib/parser/defn_spec.rb +1409 -0
  66. data/spec/lib/parser/defs_spec.rb +247 -0
  67. data/spec/lib/parser/dot2_spec.rb +29 -0
  68. data/spec/lib/parser/dot3_spec.rb +29 -0
  69. data/spec/lib/parser/dregx_spec.rb +127 -0
  70. data/spec/lib/parser/dstr_spec.rb +453 -0
  71. data/spec/lib/parser/dsym_spec.rb +31 -0
  72. data/spec/lib/parser/dxstr_spec.rb +31 -0
  73. data/spec/lib/parser/ensure_spec.rb +279 -0
  74. data/spec/lib/parser/false_spec.rb +12 -0
  75. data/spec/lib/parser/flip2_spec.rb +138 -0
  76. data/spec/lib/parser/flip3_spec.rb +100 -0
  77. data/spec/lib/parser/for_spec.rb +279 -0
  78. data/spec/lib/parser/gasgn_spec.rb +34 -0
  79. data/spec/lib/parser/gvar_spec.rb +33 -0
  80. data/spec/lib/parser/hash_spec.rb +77 -0
  81. data/spec/lib/parser/iasgn_spec.rb +54 -0
  82. data/spec/lib/parser/if_spec.rb +439 -0
  83. data/spec/lib/parser/iter_spec.rb +2582 -0
  84. data/spec/lib/parser/lasgn_spec.rb +1066 -0
  85. data/spec/lib/parser/lit_spec.rb +75 -0
  86. data/spec/lib/parser/masgn_spec.rb +1970 -0
  87. data/spec/lib/parser/match2_spec.rb +47 -0
  88. data/spec/lib/parser/match3_spec.rb +54 -0
  89. data/spec/lib/parser/match_spec.rb +19 -0
  90. data/spec/lib/parser/module_spec.rb +102 -0
  91. data/spec/lib/parser/nil_spec.rb +13 -0
  92. data/spec/lib/parser/not_spec.rb +39 -0
  93. data/spec/lib/parser/nth_ref_spec.rb +12 -0
  94. data/spec/lib/parser/op_asgn_spec.rb +619 -0
  95. data/spec/lib/parser/or_spec.rb +155 -0
  96. data/spec/lib/parser/postexe_spec.rb +31 -0
  97. data/spec/lib/parser/regex_spec.rb +52 -0
  98. data/spec/lib/parser/rescue_spec.rb +1028 -0
  99. data/spec/lib/parser/return_spec.rb +151 -0
  100. data/spec/lib/parser/sclass_spec.rb +172 -0
  101. data/spec/lib/parser/str_spec.rb +162 -0
  102. data/spec/lib/parser/super_spec.rb +276 -0
  103. data/spec/lib/parser/true_spec.rb +12 -0
  104. data/spec/lib/parser/undef_spec.rb +222 -0
  105. data/spec/lib/parser/until_spec.rb +286 -0
  106. data/spec/lib/parser/valias_spec.rb +12 -0
  107. data/spec/lib/parser/while_spec.rb +458 -0
  108. data/spec/lib/parser/xstr_spec.rb +12 -0
  109. data/spec/lib/parser/yield_spec.rb +202 -0
  110. data/spec/lib/parser/zsuper_spec.rb +101 -0
  111. data/spec/matchers/parse_as.rb +27 -0
  112. data/spec/spec_helper.rb +10 -0
  113. metadata +168 -0
@@ -0,0 +1,219 @@
1
+ #include "ruby.h"
2
+
3
+ #include "symbols.hpp"
4
+
5
+ #ifdef __cplusplus
6
+ extern "C" {
7
+ #endif
8
+
9
+ namespace melbourne {
10
+ ID rb_sOpAnd;
11
+ ID rb_sOpOr;
12
+
13
+ ID rb_sAlias;
14
+ ID rb_sAnd;
15
+ ID rb_sArgs;
16
+ ID rb_sArgsCat;
17
+ ID rb_sArgsPush;
18
+ ID rb_sArray;
19
+ ID rb_sAttrAsgn;
20
+ ID rb_sBackRef;
21
+ ID rb_sBegin;
22
+ ID rb_sBlock;
23
+ ID rb_sBlockArg;
24
+ ID rb_sBlockPass;
25
+ ID rb_sBreak;
26
+ ID rb_sCall;
27
+ ID rb_sCase;
28
+ ID rb_sCDecl;
29
+ ID rb_sClass;
30
+ ID rb_sColon2;
31
+ ID rb_sColon3;
32
+ ID rb_sConst;
33
+ ID rb_sCVar;
34
+ ID rb_sCVAsgn;
35
+ ID rb_sCVDecl;
36
+ ID rb_sData;
37
+ ID rb_sDefined;
38
+ ID rb_sDefn;
39
+ ID rb_sDefs;
40
+ ID rb_sDot2;
41
+ ID rb_sDot3;
42
+ ID rb_sDRegx;
43
+ ID rb_sDRegxOnce;
44
+ ID rb_sDStr;
45
+ ID rb_sDSym;
46
+ ID rb_sDXStr;
47
+ ID rb_sEnsure;
48
+ ID rb_sEvStr;
49
+ ID rb_sFalse;
50
+ ID rb_sFCall;
51
+ ID rb_sFile;
52
+ ID rb_sFixnum;
53
+ ID rb_sFlip2;
54
+ ID rb_sFlip3;
55
+ ID rb_sFloat;
56
+ ID rb_sFor;
57
+ ID rb_sGAsgn;
58
+ ID rb_sGVar;
59
+ ID rb_sHash;
60
+ ID rb_sIAsgn;
61
+ ID rb_sIf;
62
+ ID rb_sIter;
63
+ ID rb_sIVar;
64
+ ID rb_sLAsgn;
65
+ ID rb_sLit;
66
+ ID rb_sLVar;
67
+ ID rb_sMAsgn;
68
+ ID rb_sMatch;
69
+ ID rb_sMatch2;
70
+ ID rb_sMatch3;
71
+ ID rb_sModule;
72
+ ID rb_sNegate;
73
+ ID rb_sNext;
74
+ ID rb_sNil;
75
+ ID rb_sNot;
76
+ ID rb_sNthRef;
77
+ ID rb_sNumber;
78
+ ID rb_sOpAsgn1;
79
+ ID rb_sOpAsgn2;
80
+ ID rb_sOpAsgnAnd;
81
+ ID rb_sOpAsgnOr;
82
+ ID rb_sOr;
83
+ ID rb_sPostExe;
84
+ ID rb_sRedo;
85
+ ID rb_sRegex;
86
+ ID rb_sResbody;
87
+ ID rb_sRescue;
88
+ ID rb_sRetry;
89
+ ID rb_sReturn;
90
+ ID rb_sSClass;
91
+ ID rb_sScope;
92
+ ID rb_sSelf;
93
+ ID rb_sSplat;
94
+ ID rb_sStr;
95
+ ID rb_sSuper;
96
+ ID rb_sSValue;
97
+ ID rb_sToAry;
98
+ ID rb_sTrue;
99
+ ID rb_sUndef;
100
+ ID rb_sUntil;
101
+ ID rb_sVAlias;
102
+ ID rb_sVCall;
103
+ ID rb_sWhen;
104
+ ID rb_sWhile;
105
+ ID rb_sXStr;
106
+ ID rb_sYield;
107
+ ID rb_sZArray;
108
+ ID rb_sZSuper;
109
+
110
+ };
111
+
112
+ #ifdef __cplusplus
113
+ } /* extern "C" { */
114
+ #endif
115
+
116
+ namespace melbourne {
117
+
118
+ void init_symbols() {
119
+ rb_sOpAnd = rb_intern("and");
120
+ rb_sOpOr = rb_intern("or");
121
+
122
+ rb_sAlias = rb_intern("process_alias");
123
+ rb_sAnd = rb_intern("process_and");
124
+ rb_sArgs = rb_intern("process_args");
125
+ rb_sArgsCat = rb_intern("process_argscat");
126
+ rb_sArgsPush = rb_intern("process_argspush");
127
+ rb_sArray = rb_intern("process_array");
128
+ rb_sAttrAsgn = rb_intern("process_attrasgn");
129
+ rb_sBackRef = rb_intern("process_back_ref");
130
+ rb_sBegin = rb_intern("process_begin");
131
+ rb_sBlock = rb_intern("process_block");
132
+ rb_sBlockArg = rb_intern("process_block_arg");
133
+ rb_sBlockPass = rb_intern("process_block_pass");
134
+ rb_sBreak = rb_intern("process_break");
135
+ rb_sCall = rb_intern("process_call");
136
+ rb_sCase = rb_intern("process_case");
137
+ rb_sCDecl = rb_intern("process_cdecl");
138
+ rb_sClass = rb_intern("process_class");
139
+ rb_sColon2 = rb_intern("process_colon2");
140
+ rb_sColon3 = rb_intern("process_colon3");
141
+ rb_sConst = rb_intern("process_const");
142
+ rb_sCVar = rb_intern("process_cvar");
143
+ rb_sCVAsgn = rb_intern("process_cvasgn");
144
+ rb_sCVDecl = rb_intern("process_cvdecl");
145
+ rb_sData = rb_intern("process_data");
146
+ rb_sDefined = rb_intern("process_defined");
147
+ rb_sDefn = rb_intern("process_defn");
148
+ rb_sDefs = rb_intern("process_defs");
149
+ rb_sDot2 = rb_intern("process_dot2");
150
+ rb_sDot3 = rb_intern("process_dot3");
151
+ rb_sDRegx = rb_intern("process_dregx");
152
+ rb_sDRegxOnce = rb_intern("process_dregx_once");
153
+ rb_sDStr = rb_intern("process_dstr");
154
+ rb_sDSym = rb_intern("process_dsym");
155
+ rb_sDXStr = rb_intern("process_dxstr");
156
+ rb_sEnsure = rb_intern("process_ensure");
157
+ rb_sEvStr = rb_intern("process_evstr");
158
+ rb_sFalse = rb_intern("process_false");
159
+ rb_sFCall = rb_intern("process_fcall");
160
+ rb_sFile = rb_intern("process_file");
161
+ rb_sFixnum = rb_intern("process_fixnum");
162
+ rb_sFlip2 = rb_intern("process_flip2");
163
+ rb_sFlip3 = rb_intern("process_flip3");
164
+ rb_sFloat = rb_intern("process_float");
165
+ rb_sFor = rb_intern("process_for");
166
+ rb_sGAsgn = rb_intern("process_gasgn");
167
+ rb_sGVar = rb_intern("process_gvar");
168
+ rb_sHash = rb_intern("process_hash");
169
+ rb_sIAsgn = rb_intern("process_iasgn");
170
+ rb_sIf = rb_intern("process_if");
171
+ rb_sIter = rb_intern("process_iter");
172
+ rb_sIVar = rb_intern("process_ivar");
173
+ rb_sLAsgn = rb_intern("process_lasgn");
174
+ rb_sLit = rb_intern("process_lit");
175
+ rb_sLVar = rb_intern("process_lvar");
176
+ rb_sMAsgn = rb_intern("process_masgn");
177
+ rb_sMatch = rb_intern("process_match");
178
+ rb_sMatch2 = rb_intern("process_match2");
179
+ rb_sMatch3 = rb_intern("process_match3");
180
+ rb_sModule = rb_intern("process_module");
181
+ rb_sNegate = rb_intern("process_negate");
182
+ rb_sNext = rb_intern("process_next");
183
+ rb_sNil = rb_intern("process_nil");
184
+ rb_sNot = rb_intern("process_not");
185
+ rb_sNthRef = rb_intern("process_nth_ref");
186
+ rb_sNumber = rb_intern("process_number");
187
+ rb_sOpAsgn1 = rb_intern("process_op_asgn1");
188
+ rb_sOpAsgn2 = rb_intern("process_op_asgn2");
189
+ rb_sOpAsgnAnd = rb_intern("process_op_asgn_and");
190
+ rb_sOpAsgnOr = rb_intern("process_op_asgn_or");
191
+ rb_sOr = rb_intern("process_or");
192
+ rb_sPostExe = rb_intern("process_postexe");
193
+ rb_sRedo = rb_intern("process_redo");
194
+ rb_sRegex = rb_intern("process_regex");
195
+ rb_sResbody = rb_intern("process_resbody");
196
+ rb_sRescue = rb_intern("process_rescue");
197
+ rb_sRetry = rb_intern("process_retry");
198
+ rb_sReturn = rb_intern("process_return");
199
+ rb_sSClass = rb_intern("process_sclass");
200
+ rb_sScope = rb_intern("process_scope");
201
+ rb_sSelf = rb_intern("process_self");
202
+ rb_sSplat = rb_intern("process_splat");
203
+ rb_sStr = rb_intern("process_str");
204
+ rb_sSuper = rb_intern("process_super");
205
+ rb_sSValue = rb_intern("process_svalue");
206
+ rb_sToAry = rb_intern("process_to_ary");
207
+ rb_sTrue = rb_intern("process_true");
208
+ rb_sUndef = rb_intern("process_undef");
209
+ rb_sUntil = rb_intern("process_until");
210
+ rb_sVAlias = rb_intern("process_valias");
211
+ rb_sVCall = rb_intern("process_vcall");
212
+ rb_sWhen = rb_intern("process_when");
213
+ rb_sWhile = rb_intern("process_while");
214
+ rb_sXStr = rb_intern("process_xstr");
215
+ rb_sYield = rb_intern("process_yield");
216
+ rb_sZArray = rb_intern("process_zarray");
217
+ rb_sZSuper = rb_intern("process_zsuper");
218
+ }
219
+ };
@@ -0,0 +1,116 @@
1
+ #ifndef MEL_SYMBOLS_HPP
2
+ #define MEL_SYMBOLS_HPP
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ namespace melbourne {
9
+ extern ID rb_sOpAnd;
10
+ extern ID rb_sOpOr;
11
+
12
+ extern ID rb_sAlias;
13
+ extern ID rb_sAnd;
14
+ extern ID rb_sArgs;
15
+ extern ID rb_sArgsCat;
16
+ extern ID rb_sArgsPush;
17
+ extern ID rb_sArray;
18
+ extern ID rb_sAttrAsgn;
19
+ extern ID rb_sBackRef;
20
+ extern ID rb_sBegin;
21
+ extern ID rb_sBlock;
22
+ extern ID rb_sBlockArg;
23
+ extern ID rb_sBlockPass;
24
+ extern ID rb_sBreak;
25
+ extern ID rb_sCall;
26
+ extern ID rb_sCase;
27
+ extern ID rb_sCDecl;
28
+ extern ID rb_sClass;
29
+ extern ID rb_sColon2;
30
+ extern ID rb_sColon3;
31
+ extern ID rb_sConst;
32
+ extern ID rb_sCVar;
33
+ extern ID rb_sCVAsgn;
34
+ extern ID rb_sCVDecl;
35
+ extern ID rb_sData;
36
+ extern ID rb_sDefined;
37
+ extern ID rb_sDefn;
38
+ extern ID rb_sDefs;
39
+ extern ID rb_sDot2;
40
+ extern ID rb_sDot3;
41
+ extern ID rb_sDRegx;
42
+ extern ID rb_sDRegxOnce;
43
+ extern ID rb_sDStr;
44
+ extern ID rb_sDSym;
45
+ extern ID rb_sDXStr;
46
+ extern ID rb_sEnsure;
47
+ extern ID rb_sEvStr;
48
+ extern ID rb_sFalse;
49
+ extern ID rb_sFCall;
50
+ extern ID rb_sFile;
51
+ extern ID rb_sFixnum;
52
+ extern ID rb_sFlip2;
53
+ extern ID rb_sFlip3;
54
+ extern ID rb_sFloat;
55
+ extern ID rb_sFor;
56
+ extern ID rb_sGAsgn;
57
+ extern ID rb_sGVar;
58
+ extern ID rb_sHash;
59
+ extern ID rb_sIAsgn;
60
+ extern ID rb_sIf;
61
+ extern ID rb_sIter;
62
+ extern ID rb_sIVar;
63
+ extern ID rb_sLAsgn;
64
+ extern ID rb_sLit;
65
+ extern ID rb_sLVar;
66
+ extern ID rb_sMAsgn;
67
+ extern ID rb_sMatch;
68
+ extern ID rb_sMatch2;
69
+ extern ID rb_sMatch3;
70
+ extern ID rb_sModule;
71
+ extern ID rb_sNegate;
72
+ extern ID rb_sNext;
73
+ extern ID rb_sNil;
74
+ extern ID rb_sNot;
75
+ extern ID rb_sNthRef;
76
+ extern ID rb_sNumber;
77
+ extern ID rb_sOpAsgn1;
78
+ extern ID rb_sOpAsgn2;
79
+ extern ID rb_sOpAsgnAnd;
80
+ extern ID rb_sOpAsgnOr;
81
+ extern ID rb_sOr;
82
+ extern ID rb_sPostExe;
83
+ extern ID rb_sRedo;
84
+ extern ID rb_sRegex;
85
+ extern ID rb_sResbody;
86
+ extern ID rb_sRescue;
87
+ extern ID rb_sRetry;
88
+ extern ID rb_sReturn;
89
+ extern ID rb_sSClass;
90
+ extern ID rb_sScope;
91
+ extern ID rb_sSelf;
92
+ extern ID rb_sSplat;
93
+ extern ID rb_sStr;
94
+ extern ID rb_sSuper;
95
+ extern ID rb_sSValue;
96
+ extern ID rb_sToAry;
97
+ extern ID rb_sTrue;
98
+ extern ID rb_sUndef;
99
+ extern ID rb_sUntil;
100
+ extern ID rb_sVAlias;
101
+ extern ID rb_sVCall;
102
+ extern ID rb_sWhen;
103
+ extern ID rb_sWhile;
104
+ extern ID rb_sXStr;
105
+ extern ID rb_sYield;
106
+ extern ID rb_sZArray;
107
+ extern ID rb_sZSuper;
108
+
109
+ void init_symbols();
110
+ };
111
+
112
+ #ifdef __cplusplus
113
+ } /* extern "C" { */
114
+ #endif
115
+
116
+ #endif
@@ -0,0 +1,113 @@
1
+ #ifdef __cplusplus
2
+ extern "C" {
3
+ #endif
4
+
5
+ #include <stdlib.h>
6
+ #include <assert.h>
7
+
8
+ #include "ruby.h"
9
+ #include "var_table.hpp"
10
+
11
+ namespace melbourne {
12
+
13
+ /* max number of vars, made up. */
14
+ #define DATA_MAX 128
15
+
16
+ struct var_table_t {
17
+ struct var_table_t *next;
18
+ int size;
19
+ quark data[DATA_MAX];
20
+ };
21
+
22
+ var_table var_table_create() {
23
+ var_table vt = ALLOC(struct var_table_t);
24
+ vt->size = 0;
25
+ vt->next = NULL;
26
+ return vt;
27
+ }
28
+
29
+ void var_table_destroy(var_table vt) {
30
+ while (vt) {
31
+ var_table cur = vt;
32
+ vt = vt->next;
33
+
34
+ xfree(cur);
35
+ }
36
+ }
37
+
38
+ var_table var_table_push(var_table cur) {
39
+ var_table vt = var_table_create();
40
+ vt->next = cur;
41
+ return vt;
42
+ }
43
+
44
+ var_table var_table_pop(var_table cur) {
45
+ var_table nw;
46
+
47
+ nw = cur->next;
48
+ xfree(cur);
49
+ return nw;
50
+ }
51
+
52
+ int var_table_find(const var_table tbl, const quark needle) {
53
+ int i;
54
+ for(i = 0; i < tbl->size; i++) {
55
+ if(tbl->data[i] == needle) return i;
56
+ }
57
+ return -1;
58
+ }
59
+
60
+ int var_table_find_chained(const var_table tbl, const quark needle) {
61
+ int i;
62
+ for(i = 0; i < tbl->size; i++) {
63
+ if(tbl->data[i] == needle) return i;
64
+ }
65
+
66
+ if(tbl->next) {
67
+ return var_table_find_chained(tbl->next, needle);
68
+ }
69
+ return -1;
70
+ }
71
+
72
+ int var_table_remove(var_table tbl, const quark needle) {
73
+ int i;
74
+ for(i = 0; i < tbl->size; i++) {
75
+ if(tbl->data[i] == needle) {
76
+ tbl->data[i] = -1;
77
+ return i;
78
+ }
79
+ }
80
+ return -1;
81
+ }
82
+
83
+ int var_table_add(var_table tbl, const quark item) {
84
+ int idx;
85
+ idx = tbl->size;
86
+ assert(idx < DATA_MAX);
87
+ tbl->data[idx] = item;
88
+ tbl->size++;
89
+ return idx;
90
+ }
91
+
92
+ int var_table_size(const var_table tbl)
93
+ {
94
+ return tbl->size;
95
+ }
96
+
97
+ quark var_table_get(const var_table tbl, const int index)
98
+ {
99
+ assert(index < tbl->size);
100
+ return tbl->data[index];
101
+ }
102
+
103
+ void var_table_subtract(var_table tbl, var_table sub) {
104
+ int sz = var_table_size(sub);
105
+ for(int i = 0; i < sz; i++) {
106
+ var_table_remove(tbl, var_table_get(sub, i));
107
+ }
108
+ }
109
+ };
110
+
111
+ #ifdef __cplusplus
112
+ } /* extern "C" { */
113
+ #endif
@@ -0,0 +1,33 @@
1
+ #ifndef MEL_VAR_TABLE_HPP
2
+ #define MEL_VAR_TABLE_HPP
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "quark.hpp"
9
+
10
+ namespace melbourne {
11
+ struct var_table_t;
12
+ typedef struct var_table_t *var_table;
13
+
14
+ var_table var_table_create();
15
+ void var_table_destroy(var_table vt);
16
+ var_table var_table_push(var_table cur);
17
+ var_table var_table_pop(var_table cur);
18
+ int var_table_find(const var_table tbl, const quark needle);
19
+ int var_table_find_chained(const var_table tbl, const quark needle);
20
+
21
+ int var_table_remove(var_table tbl, const quark needle);
22
+ int var_table_add(var_table tbl, const quark item);
23
+ int var_table_size(const var_table tbl);
24
+ quark var_table_get(const var_table tbl, const int index);
25
+
26
+ void var_table_subtract(var_table tbl, var_table sub);
27
+ };
28
+
29
+ #ifdef __cplusplus
30
+ } /* extern "C" { */
31
+ #endif
32
+
33
+ #endif